poj1703
来源:互联网 发布:在vb集成开发环境中 编辑:程序博客网 时间:2024/04/30 17:57
看了一天的 并查集 路径压缩 做一道简单的题目
现在对它有了一点认识。
还得继续努力 加油。
//题意 判断两个人是不是属于相同的的犯罪集团.不相同 或 不确定 三种可能。
#include<stdio.h>#define max 100010int far[max];int rank[max];void inti(){ int i; for(i=1; i<=max; i++) { far[i]=i;//自己独自是一棵树; rank[i]=0;//开始定义偏移量为0; }}int find_set(int n)//路径压缩 0表示不同 1表示相同{ int tem; if(n==far[n]) return n; tem=far[n];//tem 找到前驱。 far[n]=find_set(tem); rank[n]=(rank[tem]+rank[n])%2; return far[n];}void Union_set(int a,int b){ int aa,bb; aa=find_set(a); bb=find_set(b); far[bb]=aa; rank[bb]=(rank[a]+1-rank[b])%2;}int main(){ int T; int n,m,nn,mm; char a; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); inti(); for(int j=0; j<m; j++) { getchar(); scanf("%c %d %d",&a,&nn,&mm); if(a=='A') { // printf("a=%c\n",a); int ans1=find_set(nn); int ans2=find_set(mm); // printf("1=%d 2=%d\n",ans1,ans2); //判断是不是在一个集合里面。 if(ans1==ans2) { if(rank[nn]==rank[mm]) { printf("In the same gang.\n"); } else { printf("In different gangs.\n"); } } else { printf("Not sure yet.\n"); } } else { Union_set(nn,mm); } } } return 0;}