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:\n",tt);
79         if(flag)pf("Suspicious bugs found!\n");
80         else pf("No suspicious bugs found!\n");
81         pf("\n");
82     }
83  } 

 

猜你喜欢

转载自www.cnblogs.com/randy-lo/p/12565411.html