并查集应用:
POJ1703 Find them, Catch them
题目大意:一个城市有两个帮派(我猜gngs应该差不多就这个意思吧,,不用在意这些细节啦),对于每组输入,D a b 表示a和b属于不同的帮派,A a b问你a和b是否在同一个帮派,对于每次询问,输出相应的结果即可。
分析:说白了,这题就是简化版的食物链。
和食物链的思想一样,我们用a和a+N表示a在哪个集合,这样,对于输入的D a b,我们只需合并a和b+N所在的集合即可。
#include <cstdio> #include <iostream> #include <cstring> using namespace std; #define MAX 100005 int par[2*MAX],rank[2*MAX]; void Init(int n) { for(int i=0;i<n;i++) { par[i]=i; rank[i]=1; } } int Find(int x) { while(par[x]!=x) x=par[x]; return x; } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; if(rank[x]>rank[y]) { par[y]=x; rank[x]+=rank[y]; } else { par[x]=y; rank[y]+=rank[x]; } } bool Same(int x,int y) { return Find(x)==Find(y); } int main() { int n,m,a,b; int T=0; char w; cin>>T; while(T--) { scanf("%d%d",&n,&m); Init(2*n); while(m--) { getchar(); scanf("%c%d%d",&w,&a,&b); a-=1; b-=1; if(w=='A') { if(Same(a,b+n)) puts("In different gangs."); else if(Same(a,b)) puts("In the same gang."); else puts("Not sure yet."); } else { Union(a,b+n); Union(a+n,b); } } } return 0; }
POJ2492 A Bug's Life
题目大意:Hopper教授在研究臭虫的性行为,他认为臭虫中只有不同的两性之间才能交配(即他认为臭虫中没有同性恋的存在);然后根据不同的场景,即给出交配的臭虫的编号(从1开始),然后让你判断他的假设是否正确。
这题和上一题几乎一模一样,大致改一下就AC了
#include <cstdio> #include <iostream> using namespace std; #define MAX 2010 int par[2*MAX],rank[2*MAX]; void Init(int n) { for(int i=0;i<=n;i++) { par[i]=i; rank[i]=1; } } int Find(int x) { if(par[x]!=x) return par[x]=Find(par[x]); return par[x]; } void Union(int x,int y) { x=Find(x); y=Find(y); if(rank[x]>rank[y]) { par[y]=x; rank[x]+=rank[y]; } else { par[x]=y; rank[y]+=rank[x]; } } int main() { int n,m,t; int a,b; bool flag; int T=1; cin>>t; while(t--) { scanf("%d%d",&n,&m); Init(2*n); flag=true; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); a-=1; b-=1; if(Find(a)==Find(b)) flag=false; else { Union(a,b+n); Union(a+n,b); } } printf("Scenario #%d:\n",T++); if(flag) puts("No suspicious bugs found!\n"); else puts("Suspicious bugs found!\n"); } return 0; }