poj 2492 A Bug's Life 二分图染色 || 种类并查集
题目链接
题意
有一种\(bug\),所有的交往只在异性间发生。现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往)。
思路
法一:种类并查集
参考:https://www.2cto.com/kf/201310/249052.html
对于每一个集合中的元素,用一个数组\(rank\)记录它和它的祖先性别是否相同,\(0\)为相同,\(1\)为不同。每个祖先的\(rank\)值为\(0\).
路径压缩时:rank[x] = rank[prev_fa]^rank[x];
因为是递归进行的路径压缩,所以更新\(x\)的\(rank\)时,它之前父亲的\(rank\)值已经被更新过了,因为\(0\)表示相同,\(1\)表示不同,所以若\(rank[x]=0\),意味着\(x\)和它之前父亲的性别一样,其和新父亲的关系 和 原父亲与新父亲的关系 相同;若\(rank[x]=1\),意味着\(x\)和它之前父亲的性别不同,其和新父亲的关系 和 原父亲与新父亲的关系 不同。其实就是异或。
合并时:rank[xx]=!(rank[x]^rank[y]);
这里\(x\)的父亲为\(xx\),\(y\)的父亲为\(yy\). 若\(rank[x]==rank[y]\),因为\(x\)和\(y\)性别不同,而\(x\)和\(xx\)性别的关系与\(y\)和\(yy\)性别的关系相同,所以\(xx\)和\(yy\)性别不同;若\(rank[x]!=rank[y]\),因为\(x\)和\(y\)性别不同,而\(x\)和\(xx\)性别的关系与\(y\)和\(yy\)性别的关系也不同,所以\(xx\)和\(yy\)性别相同。其实就是同或。
法二:判断二分图
也可以用并查集写~
Code
Ver. 1
#include <stdio.h>
#include <iostream>
#define maxn 2010
using namespace std;
typedef long long LL;
int fa[maxn], rk[maxn], sz[maxn];
int find(int x) {
if (fa[x] == x) return x;
int tmp = fa[x];
fa[x] = find(fa[x]);
rk[x] = rk[tmp] ^ rk[x];
return fa[x];
}
int kas;
void work() {
printf("Scenario #%d:\n", ++kas);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) sz[i] = 1, fa[i] = i, rk[i] = 0;
bool flag = false;
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
if (flag) continue;
int xx = find(x), yy = find(y);
if (xx == yy) {
if (rk[x] == rk[y]) flag = true;
}
else {
if (sz[xx] > sz[yy]) swap(xx, yy), swap(x, y);
fa[xx] = yy; rk[xx] = !(rk[x] ^ rk[y]); sz[yy] += sz[xx];
}
}
if (flag) printf("Suspicious bugs found!\n\n");
else printf("No suspicious bugs found!\n\n");
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}
Ver.2
#include <stdio.h>
#include <iostream>
#define maxn 4010
using namespace std;
typedef long long LL;
int fa[maxn], rk[maxn], sz[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void unionn(int x, int y) {
x = find(x), y = find(y);
if (sz[x] > sz[y]) swap(x, y);
fa[x] = y, sz[y] += sz[x];
}
int kas;
void work() {
printf("Scenario #%d:\n", ++kas);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= 2*n; ++i) sz[i] = 1, fa[i] = i;
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
unionn(x, y+n), unionn(y, x+n);
}
bool flag = false;
for (int i = 1; i <= n; ++i) if (find(i)==find(i+n)) { flag = true; break; }
if (flag) printf("Suspicious bugs found!\n\n");
else printf("No suspicious bugs found!\n\n");
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}
poj 2492 A Bug's Life 二分图染色 || 种类并查集的更多相关文章
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- POJ 2492 A Bug's Life(带权并查集)
题目链接:http://poj.org/problem?id=2492 题目大意:有n只虫子,m对关系,m行每行有x y两个编号的虫子,告诉你每对x和y都为异性,先说的是对的,如果后面给出关系与前面的 ...
- poj 2492 a bug's life 简单带权并查集
题意大致为找同性恋的虫子.... 这个比食物链要简单些.思路完全一致,利用取余操作实现关系之间的递推. 个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集. #include<ios ...
- poj 2492 A Bug's Life【带权并查集】
就是给一个无向图判是否有奇环 用带权并查集来做,边权1表示连接的两个节点异性,否则同性,在%2意义下进行加法运算即可,最后判相同的时候也要%2,因为可能有负数 #include<iostream ...
- 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany
先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...
- poj2492 A Bug's Life【基础种类并查集】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298148.html ---by 墨染之樱花 题目链接:http://poj.org/pr ...
- hdoj-1289-A Bug's Life【种类并查集】
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- poj 1182 食物链 && nyoj 207(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52414 Accepted: 15346 Description ...
- 【POJ - 1703】Find them, Catch them(种类并查集)
Find them, Catch them 直接翻译了 Descriptions 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人.该城有N个罪犯,编号从1至N(N<=100000. ...
随机推荐
- Servlet的引入(即加入Servlet)
今天讲的Servlet是根据上一章节<创建一个学生信息表,与页面分离>而结合. 一.看图分析 此模式有问题: 1.jsp需要呼叫javabean StudentService stuSer ...
- 1_HDFS理论及安装部署
一.hadoop简介 1.hadoop的初衷是为了解决Nutch的海量数据爬取和存储的需要,HDFS来源于google的GFS,MapReduce来源于Google的MapReduce,HBase来源 ...
- 01_5_SERVLET为什么有2个init方法
01_5_SERVLET为什么有2个init方法 1. 在web.xml配置初始化参数 <servlet> <servlet-name>TestInitServlet</ ...
- Linux curl命令中,HTTP 302处理
在Linux中使用curl命令时,偶尔会遇到一些URL跳转到新的URL,即HTTP中的3XX(redirection,重定向 ). $curl -s -I $URL > log 这时在返回的报文 ...
- ubuntu 16.04 +anaconda3.6 +Nvidia DRIVER 390.77 +CUDA9.0 +cudnn7.0.4+tensorflow1.5.0+neural-style
这是我第一个人工智能实验.虽然原理不是很懂,但是觉得深度学习真的很有趣.教程如下. Table of Contents 配置 时间轴 前期准备工作 anaconda3 安装 bug 1:conda:未 ...
- RAID阵列搭建
RAID0 2个或2个以上磁盘,称为条带卷,无容错,可提高读写效率,其中一个磁盘损坏,所有文件不可读磁盘大小尽量统一,或者以最小的空间为标准,可用空间=N*min RAID1 2个或2个磁盘以上,称为 ...
- php使用curl访问https返回无结果的问题
最近在做一个微信自动登录,发起验证以后回调页面获取openid时 curl函数返回空. $appid = "appid appid "; $secret = "secre ...
- LeetCode(283)Move Zeroes
题目 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...
- vscode设置让鼠标滚动改变字体大小
打开settings.json文件 输入"editor.mouseWheelZoom": true, 这样比较方面,比默认的放大缩小来的快捷
- CodeForces - 485D Maximum Value (数学)
题意: n个数,求出这些数中满足 ai >= aj 的 ai % aj 的最大值. 排序去重,然后对于每一个a[i], 如果找到a[i] 的一个倍数 k*a[i] (k > 1)的位置,那 ...