[POI2010]GIL-Guilds(结论题)
2024-10-02 07:57:36
题意
给一张无向图,要求你用黑白灰给点染色,且满足对于任意一个黑点,至少有一个白点和他相邻;对于任意一个白点,至少有一个黑点与他相邻,对于任意一个灰点,至少同时有一个黑点和白点和灰点与他相邻,问能否成功n(<=200000) and m(<=500000)
题解
我一开始以为是一定成功。
结果忘了一个独立点的情况。
我们知道树一定是二分图。
所以用并查集求出每个联通块的随便一个生成树,跑bfs黑白染色即可。(甚至用不到灰色)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int N=;
const int M=;
int fa[N],n,m,cnt,book[N],col[N],head[N];
struct edge{
int to,nxt;
}e[M*];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
int find(int x){
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
void bfs(int s,int c){
queue<int> q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(col[v]==-){
col[v]=col[u]^;
q.push(v);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
int x=find(u);
int y=find(v);
if(x==y)continue;
book[u]=book[v]=;
add(u,v);
add(v,u);
}
for(int i=;i<=n;i++){
if(book[i]==){
printf("NIE");
return ;
}
}
printf("TAK\n");
memset(col,-,sizeof(col));
for(int i=;i<=n;i++){
if(col[i]==-){
col[i]=;
bfs(i,);
}
}
for(int i=;i<=n;i++){
if(col[i]==)printf("K\n");
else printf("S\n");
}
return ;
}
最新文章
- 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题
- 【十大经典数据挖掘算法】CART
- Web大文件上传控件-jsp-sql示例更新-Xproer.HttpUploader6.2
- 用Visual Studio Code 开发应用之 安装 Visual Studio Code
- df du
- hadoop 文件 复制 移动 FileUtil.copy
- YY前端笔试总结
- java中常用的字符串的截取方法
- 软体project(四)——一生
- C#操作Word文档(加密、解密、对应书签插入分页符)
- 自己写的一个tomcat发布脚本
- Java finalize方法使用
- Scss 与 Sass 是什么,他们的区别在哪里?
- PHP 高并发秒杀解决方案
- C++ MFC------ 快捷键
- Mac 系统重新安装的几种方法
- AX_Currency
- mysql创建用户,并指定用户的权限(grant命令)
- strstr实现
- echarts 拐点添加图片
热门文章
- 关于如何让cell一直保持选中?
- [nginx]第一篇
- HDU 1166 敌兵布阵【线段树 单点更新】
- day02变量
- 为什么maven 创建web工程不自动生成Deployment Descriptor:工程名
- mac终端安装webpack的时候报错Err,解决的办法 sudo npm install webpack -g
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
- react添加右键点击事件
- linux下创建带password的用户
- mysql-面试题目1