POJ2492A Bug's Life【并查集+根节点偏移】

大意:

告诉你一些关系

a b 代表 a 和 b 是异性

问这些关系中有没有错误的语句

分析:

有并查集维护其是否在同一个集合之中  在开一个num数组来维护对于根节点的偏移量

在find的时候只需要递归到根节点返回的过程中把num数组进行维护就可以了

在进行合并的时候我们需要考虑到把一个点的根节点并到另一个的根节点上

所以要根据u和v的偏移关系推广到u和v的根节点的关系之上

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int maxn = 2005;
 7 int fa[maxn], num[maxn];
 8
 9 void init(int n) {
10     for(int i = 0; i <= n; i++) {
11         fa[i] = i;
12         num[i] = 0;
13     }
14 }
15
16 int find(int i) {
17     if(i == fa[i]) {
18         return i;
19     }
20     int fi = fa[i];
21     fa[i] = find(fa[i]);
22     num[i] = (num[fi] + num[i]) % 2;
23     return fa[i];
24 }
25
26 void unin(int u, int v) {
27     int fu = find(u); int fv = find(v);
28     if(fu != fv) {
29         fa[fv] = fu;
30         if(num[fu] == num[u]) {
31             if(num[fv] == num[v]) {
32                 num[fv] = num[fu] == 0 ? 1 : 0;
33             } else {
34                 num[fv] = num[fu] == 0 ? 0 : 1;
35             }
36         } else {
37             if(num[fv] == num[v]) {
38                 num[fv] = num[fu] == 0 ? 0 : 1;
39             } else {
40                 num[fv] = num[fu] == 0 ? 1 : 0;
41             }
42         }
43     }
44 }
45
46 int main() {
47     int t;
48     int n, m;
49     int a, b;
50     scanf("%d",&t);
51     for(int kase = 1; kase <= t; kase++) {
52         scanf("%d %d",&n, &m);
53         init(n);
54         bool flag = false;
55         while(m--) {
56             scanf("%d %d", &a, &b);
57             if(find(a) != find(b) ) {
58                 unin(a, b);
59             } else {
60                 if(num[a] == num[b]) {
61                     flag = true;
62                 }
63             }
64         }
65         printf("Scenario #%d:\n", kase);
66         if(flag) {
67             puts("Suspicious bugs found!");
68         } else {
69             puts("No suspicious bugs found!");
70         }
71         puts("");
72     }
73     return 0;
74 }

POJ2492A Bug's Life【并查集+根节点偏移】

时间: 2024-11-05 16:31:00

POJ2492A Bug's Life【并查集+根节点偏移】的相关文章

poj2492--A Bug&#39;s Life(并查集变形)

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28703   Accepted: 9350 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders

POJ1182食物链【并查集+根节点的偏移】

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否

hdu 1829 A Bug&#39;s Life 并查集系列

1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 using namespace std; 7 8 #define MAXN 2222 9 int fa[MAXN]; 10 int rnk[MAXN]; //秩 表示某点与根的距离 11 int n,

POJ 2492 || HDU 1829:A Bug&#39;s Life(并查集)

传送门: POJ:点击打开链接 HDU:点击打开链接 A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 27624   Accepted: 8979 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they fe

poj2492 A Bug&#39;s Life (并查集拓展)

C - A Bug's Life Crawling in process... Crawling failed Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2492 Appoint description: CSUST_11 (2013-04-14) System Crawler (2016-05-13) Description B

hdu 1829 A Bug&#39;s Life 并查集

点击打开链接 http://acm.hdu.edu.cn/showproblem.php?pid=1829 题意:给出n个关系啊a,b,表示a和b是异性,问是否存在矛盾,即存在a和b是同性. 思路,并查集,用f[i]记录i的父亲,next[i]表示同一个集合里的下一个元素,根据next数组可以遍历出一个集合里的所有元素,len[i]表示i和集合的根的关系,0表示同性,1表示异性. 每输入一个a和b,找到他们的根,如果根相等,那么就判断他们和根的关系,如果和根都是同性关系或者都是异性关系,则表示a

hdu1829 A Bug&#39;s Life(并查集)

开两个并查集,然后合并的时候要合并两次,这样在合并之前判断是否冲突,如果不冲突就进行合并,否则不需要继续合并. #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int MAX=2000; int pre[2*MAX+5]; bool mark; void init(int n){ int i; for(i=1

POJ 2492 A Bug&#39;s Life (并查集)

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 30130   Accepted: 9869 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders

poj 2492A Bug&#39;s Life(并查集)

1 /* 2 目大意:输入一个数t,表示测试组数.然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配. 3 要求统计交配过程中是否出现冲突,即是否有两个同性的昆虫发生交配. 4 5 思路:并查集 6 将同性的昆虫放入集合之中,如果输入的昆虫u, v同时出现在了集合中,那么 u,v就是同性的!发生了同性交配的可能! 7 */ 8 9 #include <string> 10 #include <cst