AGC064B 题解

news/2025/1/16 4:59:38/文章来源:https://www.cnblogs.com/adam01/p/18340839

设红色的点值为 0,蓝色为 1。

注意到,如果有一条边的颜色和两端点同色,一定可以选。

例子:

选择和两端点同色的边。

又发现,如果存在一个 \(sz>1\) 的合法连通块,无论和其他点怎么连,原来的这个连通块内的点一定合法。

有注意到形如 \(0\xleftrightarrow 10,1\xleftrightarrow 01\) 类型的边,除了连接两个 \(sz>1\) 的块外,无用。

那么 \(0\xleftrightarrow x1\) 这样的呢?

注意到,只用上面这种边不可能形成一个连通块,因为每次加入这种边的时候,一定只会满足一边,没有被满足的点只会移动而不会消失。

如图,即使贪心染色,根节点也无法满足。

所以,一定是从一开始的一些大连通块开始,沿着 \(0\xleftrightarrow 11\) 这样的边搜索。

搜索有点细节,因为加入孤立点要先满足孤立点的需求,所以 \(0\xleftrightarrow x1\) 的边的搜索方向应该是 \(!x\to x\)

最后合并成几个大连通块。

然后用 \(0\xleftrightarrow 10,1\xleftrightarrow 01\) 类型的边合并,就做完了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int N = 2e5 + 5;
int fa[N], n, m;int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
inline bool conn(int x, int y) {return find(x) == find(y);}
void merge(int x, int y) {fa[find(x)] = find(y);}int u[N], v[N], w[N], c[N];
bool ok[N], ch[N];vector<pair<int, int>> e[N];signed main()
{ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i = 1; i <= n; i ++) fa[i] = i;for(int i = 1; i <= m; i ++){char c; cin >> u[i] >> v[i] >> c;w[i] = c == 'R';}string s; cin >> s;for(int i = 1; i <= n; i ++)c[i] = s[i - 1] == 'R';for(int i = 1; i <= m; i ++){int x = u[i], y = v[i], z = w[i];if(conn(x, y)) continue;if(z == c[x] && z == c[y])merge(x, y), ok[x] = ok[y] = 1, ch[i] = 1;else if(z == c[x]) e[y].push_back({x, i});else if(z == c[y]) e[x].push_back({y, i});}queue<int> q;for(int i = 1; i <= n; i ++) if(ok[i]) q.push(i);while(q.size()){int t = q.front(); q.pop();for(auto [i, id] : e[t])if(!conn(t, i)){ch[id] = 1;merge(t, i);if(!ok[i]) q.push(i);ok[i] = 1;}}for(int i = 1; i <= n; i ++)if(!ok[i]) return cout << "No", 0;for(int i = 1; i <= m; i ++)if(!conn(u[i], v[i])) merge(u[i], v[i]), ch[i] = 1;cout << "Yes\n";for(int i = 1; i <= m; i ++)if(ch[i]) cout << i << " ";return 0;
}

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

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

相关文章

Java源码:泡泡堂

学习java朋友们,福利来了,今天小编给大家带来了一款泡泡堂源码。此源码仅供学习使用!! 源码搭建和讲解 代码简介包名称类描述com.whh.frame MyJFrame.java 显示窗体、绑定监听、启动线程com.whh.frame MyJPanel.java 不断读取人物信息com.whh.main GameStart.java 游戏入口…

24暑假集训day5上午

图论 差分约束 有 \(𝑛\) 个整数变量 \(𝑥_1∼𝑥_𝑛\)。 给定一些形如 \(𝑥_𝑖+𝑐≥𝑥_𝑗\) 的限制。问有没有可行解,如有输出方案。 例如 \(𝑥_1−1≥𝑥_2,𝑥_2≥𝑥_3,𝑥_3≥𝑥_1\) 就无解。 在单源最短路问题中,如果存在一条 \(𝑖→𝑗\)…

24暑假集训day4上午下午

基础图论 图的存储方式 无向边可以拆成两条有向边 1. 邻接矩阵 邻接矩阵:若 \(𝑖→𝑗\) 存在有向边,则令矩阵 \(𝐴[𝑖][𝑗]=1\)。 遍历一个点的所有出边是 \(𝑂(𝑛)\) 的。 空间复杂度 \(𝑂(𝑛^2 )\)。 总结:复杂度太高,尽量不使用 bool hasEdge[MAXN][M…

微客在线客服系统-连接一切客户

嘿,朋友们,我是微客客服,一个全能的在线客服小能手。今天,我要给大家秀一秀我的超能力——多渠道对接! 想象一下,你的企业就像一个繁忙的交通枢纽,客户咨询就像来来往往的车辆,而我,就是那个指挥交通的智能信号灯。我能帮你把客户咨询引导到正确的地方,让一切沟通都井…

Overleaf中插入pdf图片只显示图片路径的解决方式

最近在用Overleaf写一篇论文,使用IEEE的LaTex模板时发现一个问题,我使用pdfLaTex编译器无法正确显示我插入的pdf图片,网上翻解决方式没有翻到,误打误撞解决了这个问题,问题如下图所示: 即只在图片区域显示路径,不显示图片本身,解决方案是: 在右侧设置里找到编译模式,…

RHCSA 考试试题解析

1.登录测试机初始化 red bule主机 rht-vmctl reset red rht-vmctl reset blue

MySQL的执行计划详解(Explain)(整合版)

目录MySQL的执行计划详解(Explain)(整合版)1、MySQL执行计划的定义2、Explain分析示例3、语法展示4、explain中的列4.1、id4.2、select_type4.3、table4.4、type(重要的)4.5、possible_keys4.6、key4.7、key_len4.8、ref4.9、rows4.10、fitered4.11、Extra MySQL的执行计划详…

ArkTS #01# 组件通信

一、通过Prop单向传递/* * 单双向绑定都有 * 父组件@State,子组件@Link,孙组件@Prop * 数据流向:父组件 <--> 子组件 --> 孙组件*/@Entry @Component export struct BothBinding {@State fatherValue: number = 0//表示组件中的状态变量,这个状态变化会引起 UI 变…

风风影视安装使用

风风影视安装使用教程 一 安装软件下载风风影视 下载好后安装即可。二 配置地址1.点击设置 2.点击配置地址 3.将这串地址复制粘贴,点击确认https://gitee.com/ffddoz/tvbox1/raw/master/fantaiyingff.json到这步就可以使用了以下是功能介绍,非必须看点击主页之后,会有很多选…

idea=services启动类变成灰色了

idea启动大于5个services的时候就会让新启动的变成灰色,并且重启idea之后在services里找不到相关启动类(还要重新翻) 下面版本适用于2023.2.1+(老版本设置页在Advanced Settings中,略有不同) File----->Settings----->Advanced Settings----->Run/Debug,设置完…

常回家看看之tcachebin-attack

常回家看看之tcachebin-attack 自从glibc2.26之后出现了新的堆管理机制,及引用了tcachebin机制,tcachebin也是主要分配小堆块的,有40条bin链(0x10 - 0x410) 那么这样的分配有很多和smallbin 和fastbin重叠的部分,及malloc申请之后free掉的小堆块优先进入tcachebin中,这样…

java 面向对象1

1.java类一个类文件可以定义多个类,只能有一个用public修饰.java基本语法方面在有的很想c++.在学习java面向对象的时候我也得对比c++来学习.学习c++的三大特性:继承,多态,封装,是如何在java中体现的. 2.封装,封装是类最基础的特装类通过将好几个成员数据封装成一个整体,便于数据…