就是一些结点,分属两个帮派,也可能都不属于。input分两种,一种是给出异派的两个点,另一种是询问两个点的关系。这题和poj 1182相似,而且还要简单一些。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 100005 4 int fa[N]; 5 bool side[N]; 6 int find(int n) 7 { 8 if(fa[n] == n) return n; 9 int t = fa[n]; 10 fa[n] = find(t); 11 side[n] = side[n]^side[t]; 12 return fa[n]; 13 } 14 void comb(int a,int b) 15 { 16 int x=find(a), y=find(b); 17 if(x == y) return ; 18 fa[y] = x; 19 side[y] = !(side[a]^side[b]); 20 } 21 int main() 22 { 23 int T,n,m,a,b; 24 char cmd; 25 scanf("%d",&T); 26 while(T--) 27 { 28 scanf("%d%d",&n,&m); 29 getchar(); 30 for(int i=1; i <= n; i++) fa[i] = i; 31 while(m--) 32 { 33 scanf("%c %d%d",&cmd,&a,&b); 34 getchar(); 35 if(cmd == 'A') 36 { 37 if(n == 2) 38 printf("In different gangs.\n"); 39 else if(find(a) != find(b)) 40 printf("Not sure yet.\n"); 41 else if(side[a] == side[b]) 42 printf("In the same gang.\n"); 43 else printf("In different gangs.\n"); 44 } 45 else comb(a,b); 46 } 47 memset(side,0,sizeof side); 48 } 49 return 0; 50 }