poj 1703 Find them, Catch them

就是一些结点,分属两个帮派,也可能都不属于。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 }
原文地址:https://www.cnblogs.com/lzxskjo/p/2761689.html