P11022 「LAOI-6」Yet Another Graph Coloration Problem

news/2024/10/13 14:27:59

P11022 「LAOI-6」Yet Another Graph Coloration Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

关于无解情况,如果这个图有两块连通块,那么不可能同时有黑色白色,假设 \(1,2\) 连通块,设 \(1\) 中有黑色,因为 \(2\) 中点不能到 \(1\),所以 \(2\) 中只能是黑色,又因为 \(2\) 中都是黑色,\(1\) 中点不能到 \(2\),所以 \(1\) 中点都是黑色,所以一个图全是黑色。 所以只能是一整块连通图。

先考虑贪心,先把所有点变成白色,看看那些点能变为黑色。

容易发现,对于一个无出边的环,可以随便选黑色,但如果有出边,即有桥的话,桥相连点只能是同色,可以发现只要有环,那么就可以选出来两种颜色,即一定有解。而如果这张图没有环,即是一个树,那么两点不可能存在多个简单路径,因此无解。

所以,我们可以先给桥边点标记。然后从点 1 开始染黑色,并把和点 1 相连的,非同一双连通分量(即环)里的桥点也染成黑色即可。

此题结束。

注意,对于大测试量,不要循环 memset 容易爆,要采用循环清空。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;const int N = 200010, M = N * 2;int h[N], ne[M], e[M], idx;
int n, m;
int dfn[N], timestamp, dcc_cnt, low[N];
int stk[N], top, id[N];
bool st[N], flag1;
bool B[N];
vector<int> g[N];void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}void tarjan(int u, int from)
{dfn[u] = low[u] = ++ timestamp;stk[ ++ top] = u;for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (!dfn[j]){tarjan(j, i);low[u] = min(low[u], low[j]);if (dfn[u] < low[j]){st[u] = st[j] = true;}}else if (i != (from ^ 1)){low[u] = min(low[u], dfn[j]);}}if (dfn[u] == low[u]){int y;dcc_cnt ++ ;do {y = stk[top -- ];id[y] = dcc_cnt;g[dcc_cnt].push_back(y);}while (y != u);if (g[dcc_cnt].size() >= 3) flag1 = true; // 说明有环}
}void dfs(int u)
{B[u] = 1;for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (st[j] && id[u] != id[j] && !B[j])dfs(j);}
}int main()
{   int T;cin >> T;while (T -- ){cin >> n >> m;for (int i = 1; i <= n; i ++ ){st[i] = 0;dfn[i] = 0;h[i] = -1;top = 0;g[i].clear();B[i] = 0;}idx = dcc_cnt = 0;flag1 = 0;timestamp = 0;while (m -- ){int a, b;scanf("%d%d", &a, &b);add(a, b);add(b, a);}int cnt = 0;for (int i = 1; i <= n; i ++ )if (!dfn[i]){tarjan(i, -1);cnt ++ ;   }if (cnt > 1){puts("-1");continue;}if (flag1) {dfs(1);for (int i = 1; i <= n; i ++ ){if (B[i]) putchar('B');else putchar('W');}}else {puts("-1");continue;}puts("");}return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

linux练习题(二)

习题练习前预备知识(如下图):## linux练习题(二)习题以及参考答案 1、将/etc/passwd 拷贝到/home下并更名为test。cp /etc/passwd /home/test 2、在/tmp下建立test1到test9父子级目录,mkdir -p /tmp/test1/test2/test3/test4/test5/test6/test7/test8/test9 如果说该条命…

JAVA环境配置

JAVA开发环境配置 1.去官网下载JDK 找到对应的电脑版本进行安装,记住安装位置 2.安装完成后进入我的电脑-属性-高级系统设置-环境变量,点击系统变量下的新建,变量名必须为JAVA_HOME,变量值就是你刚刚的安装路径3.接着在系统变量中找到Path双击,新建如下两个,如图所示如果…

关于使用plsql操作oracle的一点小技巧和几个常用的查询语句BU

plsql是什么:就是这个,专门操作oracle的一个工具,好用还免费。 创建一个测试表: create table Student( Id number not null, Name varchar(20), Age number, Grade number, Gender varchar(2) )里面的varchar2()是oracle自己专门的字符类型,用就行了。 光标移到表上,右键…

OpenAI官方开源多智能体框架「Swarm」,并不是我想要的多智能体框架PI

今天早上,OpenAI实施团队的 @shyamal在Github上开源了Swarm这个OpenAI官方的多智能体框架。不得不说,OpenAI官方下场,获得的社区影响就是不一样,在微信群、朋友圈里已经出现大量的解析文章。这个多智能体框架确实已经把多智能体的关键,说的很透彻了,Swarm 里面定义了两个…

【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的证书Hq

问题描述 当根据Cloud Service (Extended Support) 文档更新证书 ( https://docs.azure.cn/zh-cn/cloud-services-extended-support/certificates-and-key-vault )时,如果遇见旧的证书(如中间证书,根证书)信息保存在Key Vault Secret中,而更新的时候,只能从Key Vault证书中…

Nuxt.js 应用中的 close 事件钩子详解

title: Nuxt.js 应用中的 close 事件钩子详解 date: 2024/10/13 updated: 2024/10/13 author: cmdragon excerpt: close 钩子是 Nuxt.js 中一个重要的生命周期事件,它在 Nuxt 实例正常关闭时被调用。当 Nuxt 应用的生命周期即将结束时,这一钩子会被触发,让开发者能够执行一…

高级语言程序设计课程第三次作业

班级链接:https://edu.cnblogs.com/campus/fzu 高级语言程序设计课程第三次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 学号:102400204 姓名:刘嘉奕不理解为什么要将int width=strlen(name)放在下面使用才能运行%*d用于限制输出中占位宽度忘记加&am…

互联网的路由选择协议

分层次的路由选择协议 由于以下两个原因,互联网选择分层次的路由选择协议互联网的规模十分庞大,如果让每个路由器都直到所有网络应该怎样到达,处理起来的时间和资源开销太大 许多单位不愿意让外界了解自己单位的网络布局细节和采用的路由选择协议,同时还希望连接到互联网上…