标签:路径压缩 accept message win tom bool 并查集 form desc
1 #include <cstdio> 2 using namespace std; 3 4 const int maxn=200000+10;//最大为N的两倍 5 int par[maxn];//用来存放它的父结点 6 7 void init(int s)//初始化并查集 8 { 9 for(int i=0;i<s;i++) 10 { 11 par[i]=i; 12 } 13 } 14 15 int find(int x)//找根 16 { 17 if(par[x]==x) 18 return x; 19 else 20 { 21 return par[x]=find(par[x]);//路径压缩,用根代替它的父节点 22 } 23 } 24 25 bool same(int a,int b)//判断是否属于一个集合 26 { 27 return find(a)==find(b); 28 } 29 30 void unit(int x,int y)//合并x和y代表的两个集合 31 { 32 int fx=find(x); 33 int fy=find(y); 34 par[fx]=fy; 35 } 36 37 int main() 38 { 39 int t; 40 scanf("%d",&t); 41 while(t--) 42 { 43 int n,m; 44 scanf("%d%d",&n,&m); 45 init(n*2);//初始化一个大小为本身两倍的并查集 46 for(int i=0;i<m;i++) 47 { 48 char op; 49 int x,y; 50 getchar(); 51 scanf("%c%d%d",&op,&x,&y); 52 if(op==‘D‘) 53 { 54 unit(x,y+n); 55 unit(y,x+n); 56 } 57 else if(op==‘A‘) 58 { 59 if(same(x,y) || same(x+n,y+n)) 60 { 61 printf("In the same gang.\n"); 62 } 63 else if(same(x,y+n) || same(y,x+n)) 64 { 65 printf("In different gangs.\n"); 66 } 67 else 68 { 69 printf("Not sure yet.\n"); 70 } 71 } 72 } 73 74 } 75 return 0; 76 }
标签:路径压缩 accept message win tom bool 并查集 form desc
原文地址:http://www.cnblogs.com/onlyli/p/6924612.html