poj1703——Find them, Catch them
和食物链一样的思想。还是师兄对并查集的研究比较深入啊。orz!今天对并查集的理解,更上一层楼。
并查集基本思想:每次合并的时候,修改的是一部分点到根节点的值,然后再find()里面,再进行更新。
#include<iostream>#include<cstdio>#include<string>using namespace std;#define N 100005int p,r;int n,m;int find(int a){if(p==a) return a;int t=find(p);r=(r]+r)%2;p=t;return t;}void unin(int a,int b,int f1,int f2){p=f1;r=(r+1+r)%2;}int main(){int t,i,a,b,k1,k2;char ch;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);scanf("%c",&ch);for(i=1;i<=n;i++){p=i;r=0;}while(m--){cin>>ch;scanf("%d%d",&a,&b);if(ch=='A'){k1=find(a);k2=find(b);if(k1!=k2)printf("Not sure yet.\n");else {if(r!=r)printf("In different gangs.\n");else printf("In the same gang.\n");}}else{k1=find(a);k2=find(b);if(k1!=k2)unin(a,b,k1,k2);}}}return 0;}
页:
[1]