POJ-1703 Find them,Catch them(数据结构+并查集)
http://poj.org/problem?id=1703
题意:
Tadu City里面有两个黑帮团伙Gang Dragon和Gang Snake,一共有n名团伙成员(还不知道属于这两个黑帮的哪一个)。现在警察局有一些信息,每条信息包含2个人编号,能否确定他们属于同一帮派。
思路:
并查集习题,
只要两者的关系确定了,就将他们放入同一集合内,而另外增加一个表示关系的数组rela[]来表示该结点与其父节点的关系,0表示同一类,1表示不同团伙。
初始集合时只有自己一个元素,rela设置为0.
代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<iomanip> #include<algorithm> #include<string.h> #include<queue> #include<cmath> #include<stack> using namespace std; const int maxn=1e5+10; const int inf=1e10; typedef long long ll; int p[maxn],rela[maxn]; int T,N,M,a,b; char flag; void make() { for(int i=1; i<=N; i++){ p[i]=i; rela[i]=0; } } int find(int x) { int temp=p[x]; if(x==p[x]) return x; p[x]=find(p[x]); rela[x]=(rela[x]==rela[temp])?0:1; return p[x]; } void UnionSet(int x,int y,int px,int py) { p[px]=py; rela[px]=(rela[x]==rela[y]?1:0); } int main() { cin>>T; while(T--) { cin>>N>>M; make(); while(M--) { scanf("\n%c%d%d",&flag,&a,&b); int pa=find(a),pb=find(b); if(flag=='A'){ if(pa!=pb){ cout<<"Not sure yet."<<endl; continue; } if(rela[a]==rela[b]){ cout<<"In the same gang."<<endl; continue; } cout<<"In different gangs."<<endl; continue; } if(flag=='D') if(pa!=pb) UnionSet(a,b,pa,pb); } } return 0; }