与1182一个思路 并查集加偏移量 不过比1182好做一些

1 #include <stdio.h> 2 int father[100005], r[100005]; 3 void init(int n) 4 { 5 int i; 6 for(i = 1 ; i <= n ; i++) 7 { 8 r[i] = 0; 9 father[i] = i; 10 } 11 } 12 int find(int x) 13 { 14 if(x!=father[x]) 15 { 16 int pre = father[x]; 17 father[x] = find(father[x]); 18 r[x] = (r[x]+r[pre])%2; 19 } 20 return father[x]; 21 } 22 void union1(int x, int y,int d) 23 { 24 father[x] = y; 25 r[x] = d%2; 26 } 27 int main() 28 { 29 int t, m, n, i, j, k, num, x, y; 30 char c; 31 scanf("%d", &t); 32 while(t--) 33 { 34 scanf("%d%d", &m, &n); 35 init(m); 36 while(n--) 37 { 38 getchar(); 39 scanf("%c %d %d", &c,&x,&y); 40 int pa = find(x); 41 int pb = find(y); 42 if(c == 'D') 43 { 44 if(pa!=pb) 45 union1(pa,pb,r[y]-r[x]+1); 46 } 47 else 48 { 49 if(pa == pb) 50 { 51 if(r[x] == r[y]) 52 printf("In the same gang.\n"); 53 else 54 printf("In different gangs.\n"); 55 } 56 else 57 printf("Not sure yet.\n"); 58 } 59 } 60 } 61 return 0; 62 }