hdoj 1829 A bug's life 种类并查集

Posted randy-lo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdoj 1829 A bug's life 种类并查集相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829

并查集的一个应用,就是检测是否存在矛盾,就是两个不该相交的集合有了交集。本题就是这样,一种虫子有两种性别,每次m次操作,每次给出(a,b),如果a和b是同性别就出现了错误,也就是说出现了判断它有两种性别的错误。我的策略同样是两个集合,用并查集维护两个集合之间的关系。具体证明请看我的上一篇博客,关于这种做法的正确性的证明。

代码如下:

 1 #include<bits/stdc++.h>
 2 typedef unsigned int ui;
 3 typedef long long ll;
 4 typedef unsigned long long ull;
 5 #define pf printf
 6 #define mem(a,b) memset(a,b,sizeof(a))
 7 #define prime1 1e9+7
 8 #define prime2 1e9+9
 9 #define pi 3.14159265
10 #define lson l,mid,rt<<1
11 #define rson mid+1,r,rt<<1|1
12 #define scand(x) scanf("%llf",&x) 
13 #define f(i,a,b) for(int i=a;i<=b;i++)
14 #define scan(a) scanf("%d",&a)
15 #define mp(a,b) make_pair((a),(b))
16 #define P pair<int,int>
17 #define dbg(args) cout<<#args<<":"<<args<<endl;
18 #define inf 0x3f3f3f3f
19 const int maxn=2e6+10;
20 int n,m,t;
21 inline int read(){
22     int ans=0,w=1;
23     char ch=getchar();
24     while(!isdigit(ch)){if(ch==-)w=-1;ch=getchar();}
25     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-0,ch=getchar();
26     return ans*w;
27 }
28 int f[maxn],rank[maxn];
29 bool flag;
30 void init()
31 {
32     f(i,1,2*n)f[i]=i,rank[i]=0;
33     flag=false;
34 }
35 int find(int x)
36 {
37     if(x==f[x])return x;
38     return f[x]=find(f[x]);
39 }
40 void Union(int x,int y)
41 {
42     int fx=find(x);
43     int fy=find(y);
44     if(fx==fy)return;
45     if(rank[fx]<rank[fy])f[fx]=fy;
46     else
47     {
48         f[fy]=fx;
49         if(rank[fx]==rank[fy])rank[fx]++;
50     }
51 }
52 bool same(int x,int y)
53 {
54     return find(x)==find(y);
55 }
56 int main()
57 {
58     //freopen("input.txt","r",stdin);
59     //freopen("output.txt","w",stdout);
60     std::ios::sync_with_stdio(false);
61     t=read();
62     int cnt=0;
63     f(tt,1,t)
64     {
65         n=read(),m=read();
66         init();
67         int a,b;
68         f(i,1,m)
69         {
70             a=read(),b=read();
71             if(same(a,b)||same(a+n,b+n))flag=1; 
72             else
73             {
74                 Union(a,b+n);
75                 Union(a+n,b);//将(a,b)分为不同的集合之中 
76             }
77         }
78         pf("Scenario #%d:
",tt);
79         if(flag)pf("Suspicious bugs found!
");
80         else pf("No suspicious bugs found!
");
81         pf("
");
82     }
83  } 

 

 

以上是关于hdoj 1829 A bug's life 种类并查集的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1829 A Bug's Life

HDU 1829 A Bug's Life (种类并查集)

hdoj-1289-A Bug&#39;s Life种类并查集

hdu 1829 &amp;poj 2492 A Bug&#39;s Life(推断二分图带权并查集)

hdu1829A Bug's Life(种类并查集)

带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代