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 种类并查集的主要内容,如果未能解决你的问题,请参考以下文章
hdoj-1289-A Bug's Life种类并查集
hdu 1829 &poj 2492 A Bug's Life(推断二分图带权并查集)
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代