COCI 2021-2022 #1 - Logičari 题解

题目大意

给定一个 n n n 个点的基环树,现在对基环树上的点染色,使得每个点都有且仅有一个与他相连的点(不包括它自身)被染色,求最少的染色点数,或者返回无解。

思路

先考虑树的情况。

容易想到 DP,我们设 f i , 1 / 0 , 1 / 0 f_{i,1/0,1/0} fi,1/0,1/0 表示在第 i i i 个点,它有没有染色,它的儿子中有没有染过色的。

很容易写出 DP 式。

由于是基环树,我们先把环找出来,然后对于环之外的树可以以环上的点为根先做树形DP(不包括环上的点),求出来对应的 f f f 值。

然后考虑环上,照样考虑 DP,设 g i , 1 / 0 , 2 / 1 / 0 g_{i,1/0,2/1/0} gi,1/0,2/1/0 表示在第 i i i 个点,它有没有染色,它是右边还是左边还是儿子的点染色。

但是由于是环,有后效性,于是我们可以枚举一个点的状态,然后当成链来做,最后将枚举到的最后一个点的合法状态的值取最小值即可。

代码

#include <bits/stdc++.h>
using namespace std;
int n, Ecnt, last[100005], rt, to, bz[100005], fa[100005], d[100005], f[100005][2][2], ans, g[100005][2][3];
struct Edge { int to, next; } E[200005];
void addedge(int u, int v) { Ecnt++, E[Ecnt].next = last[u], last[u] = Ecnt, E[Ecnt].to = v; }
void dfs(int x) {bz[x] = 1;for (int xy = last[x]; xy; xy = E[xy].next)if (!bz[E[xy].to])fa[E[xy].to] = x, d[E[xy].to] = d[x] + 1, dfs(E[xy].to);
}
void change(int x, int y) {bz[x] = 2;if (d[x] < d[y])swap(x, y);if (x == y) {rt = x;return ;}change(fa[x], y);
}
void DP(int x, int fa) {int son = 0;for (int xy = last[x]; xy; xy = E[xy].next)if (!bz[E[xy].to])son++, bz[E[xy].to] = 1, DP(E[xy].to, x), f[x][0][0] = f[x][0][0] + f[E[xy].to][0][1], f[x][1][0] = f[x][1][0] + f[E[xy].to][0][0];for (int xy = last[x]; xy; xy = E[xy].next)if (bz[E[xy].to] == 1 && E[xy].to != fa) {f[x][0][1] = min(f[x][0][1], f[x][0][0] - f[E[xy].to][0][1] + f[E[xy].to][1][1]);f[x][1][1] = min(f[x][1][1], f[x][1][0] - f[E[xy].to][0][0] + f[E[xy].to][1][0]);}f[x][1][0]++, f[x][1][1]++;
}
void get(int x, int fa) {for (int xy = last[x]; xy; xy = E[xy].next)if (bz[E[xy].to] == 2 && E[xy].to != fa && E[xy].to != to) {if (E[xy].to == rt) {to = x;return ;}for (int have = 0; have < 2; have++)for (int where = 0; where < 3; where++) {if (have == 1)g[E[xy].to][have][where] = min(g[E[xy].to][have][where], g[x][where == 1][2] + f[E[xy].to][have][where == 0]);elseg[E[xy].to][have][where] = min(g[E[xy].to][have][where], min(g[x][where == 1][0], g[x][where == 1][1]) + f[E[xy].to][have][where == 0]);}get(E[xy].to, x);}
}
void solve() {for (int i = 1; i <= n; i++)f[i][1][1] = f[i][0][1] = n + 1;ans = n + 1;for (int i = 1; i <= n; i++)if (bz[i] == 2)DP(i, 0);//以环上的点为根做树形DPfor (int have = 0; have < 2; have++) {for (int where = 0; where < 3; where++) {for (int i = 1; i <= n; i++)for (int j = 0; j < 3; j++)g[i][0][j] = g[i][1][j] = n + 1;g[rt][have][where] = f[rt][have][where == 0], to = 0;get(rt, 0);if (have == 1)ans = min(ans, g[to][where == 1][2]);elseans = min(ans, min(g[to][where == 1][0], g[to][where == 1][1]));}}if (ans == n + 1)printf("-1");elseprintf("%d\n", ans);
}
int main() {scanf("%d", &n);for (int i = 1, u, v; i <= n; i++)scanf("%d%d", &u, &v), addedge(u, v), addedge(v, u);dfs(1);//先建树for (int i = 1; i <= n; i++)bz[i] = 0;for (int x = 1; x <= n; x++)for (int xy = last[x]; xy; xy = E[xy].next)if (fa[E[xy].to] != x && E[xy].to != fa[x]) {//找环bz[x] = bz[E[xy].to] = 2;change(x, E[xy].to);//标记环上的点solve();return 0;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

README文档模板

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

TCP和UDP的由浅到深的详细讲解

目录 前言 一.TCP 1.1 什么是TCP&#xff1f; 1.2TCP的连接与释放(确认应答机制&#xff09; 1.2.1三次握手 1.2.2四次挥手 1.3TCP滑动窗口&#xff08;效率机制&#xff09; 1.4流量控制&#xff08;安全机制&#xff09; 1.5拥塞控制&#xff08;安全机制&#xff0…

【力扣1812】判断国际象棋棋盘中一个格子的颜色

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;判断国际象棋棋盘中一个格子的颜色 给你一个坐标 coordina…

环信web、uniapp、微信小程序SDK报错详解---登录篇

项目场景&#xff1a; 记录对接环信sdk时遇到的一系列问题&#xff0c;总结一下避免大家再次踩坑。这里主要针对于web、uniapp、微信小程序在对接环信sdk时遇到的问题。主要针对报错400、404、401、40 (一) 登录用户报400 原因分析&#xff1a; 从console控制台输出及networ…

【C++】哈希与布隆过滤器

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Unity 之 EditorGUILayout.BeginHorizontal/EndHorizontal异常报错问题

报错内容&#xff1a; 缘由&#xff1a;由于在EditorGUILayout.EndHorizontal()之前执行了类似打开窗口的逻辑 解决办法&#xff1a; 在EditorGUILayout.EndHorizontal()之前执行GUIUtility.ExitGUI();

javascript制作简单的富文本,基本功能都实现,除了上传图片只能用URL

//所有的图标用的字符&#xff0c;以后可以换成网上的css-icon图标库的图标&#xff0c;再设置一下css样式即可简单的使用 //这里所有的标签元素都是直接获取&#xff0c;没有使用委托&#xff0c;如果使用委托性能会更好&#xff0c;这里只做了简单的清理&#xff0c;让内存回…

Android中的进度条

1.xml文件中: <ProgressBar... ...style"style/Widget.AppCompat.ProgressBar.Horizontal"android:max"100"android:progress"0"android:progressDrawable"drawable/ ~ "/>style属性设置水平条形进度条&#xff08;默认圆形&am…

pyinstaller 使用

python 打包不依赖于系统环境的应用总结 【pyd库和pyinstaller可执行程序的区别: 在实际开发中&#xff0c;对于多人协作的大型项目&#xff0c; 或者是基于支持Python的商业软件的二次开发等&#xff0c; 如果将py脚本打包成exe可执行文件&#xff0c;不仅不方便调用&#xff…

uniapp 条件编译 APP 、 H5 、 小程序

一、#ifdef、#ifndef、 #endif三者的区别、 标识作用#ifdef仅在某个平台上使用#ifndef在除了这个平台的其他平台上使用(非此平台使用&#xff09;#endif结束条件编译 二、平台标识 标识平台APP-PLUS5AppMP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序MP-WEIXIN微…

利用KerasCV YOLOv8轻松实现目标精确检测

本文中将实现基于KerasCV YOLOv8的交通灯信号检测,并附录完整代码。。 自从You Only Look Once(简称 YOLO)的诞生以来,目标检测问题主要通过深度学习来解决。大多数深度学习架构通过巧妙地将目标检测问题构建为多个小分类问题和回归问题的组合来实现。具体而言,它是通过在…

Redis-04独立功能的实现

1、发布与订阅 介绍&#xff1a; Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过SUBSCRIBE命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;成为这些频道的订阅者&#xff08;subscriber&#xff09;每当有其他客户端向被订阅的频道发送消…

监控搭建-Prometheus

监控搭建-Prometheus 1、背景2、目标3、选型4、Prometheus4.1、介绍4.2、架构4.3、构件4.4、运行机制4.5、环境介绍4.6、数据准备4.7、网络策略4.7.1、主机端口放行4.7.2、设备端口放行 4.8、部署4.9、验证4.10、配置 1、背景 随着项目信息化进程的推进&#xff0c;操作系统、…

2579. 统计染色格子数(javascript)

有一个无穷大的二维网格图&#xff0c;一开始所有格子都未染色。给你一个正整数 n &#xff0c;表示你需要执行以下步骤 n 分钟&#xff1a; 第一分钟&#xff0c;将 任一格子染成蓝色。之后的每一分钟&#xff0c;将与蓝色格子相邻的 所有 未染色格子染成蓝色。 下图分别是 …

Redis-02单机数据库的实现

Redis-02单机数据库的实现 1、服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中&#xff0c;db数组的每个项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库&#xff1b; 在初始化服务器时&#xff0c…

竞赛 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

如何从零开始系统的学习项目管理?

一、项目的概念 根据项目管理协会&#xff08;PMI&#xff09;的定义&#xff0c;项目是指为了创造独特的产品、服务或成果而进行的临时性工作。这意味着项目需要有明确的目标&#xff0c;且不是日常重复性工作。尽管项目是临时性工作&#xff0c;但它所交付的成果可能会持续存…

锁降级 ReentrantReadWriteLock

锁降级 ReentrantReadWriteLock 所谓降级&#xff0c;可以通过一个例子理解&#xff0c;一般都是写的权限大&#xff0c;读的权限小&#xff0c;从写到读自然是降级&#xff0c;这是通俗的理解。 锁降级&#xff1a;同一个线程先获取写锁&#xff0c;在写锁未释放的情况下&…

【计算机网络】poll | epoll

文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面…

【计算机视觉 05】YOLO论文讲解:V1-V7

https://ai.deepshare.net/live_pc/l_63243a65e4b050af23b79338 Part1.目标检测与YOLO系列 1. 目标检测任务及发展脉络 2. YOLO的发展史 Anchors Base原理&#xff1a; Part2.YOLOV1-V3 3. YOLO V1的网络结构 4. YOLO V3的网络结构与实验结果 Part3.YOLO的进化 5. YOLO V4的网络…