Input
The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.Output
For each message "A [a] [b]" in each case, your program should give the judgment based on the information got before. The answers might be one of "In the same gang.", "In different gangs." and "Not sure yet."Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4Sample Output
Not sure yet. In different gangs. In the same gang. 思路:这道题用到的是食物链的思想,以(x+n)代表敌对关系 #include <cstdio> #include <iostream> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 1e6; int sign[maxn]; int n, m, t; void init() { for(int i = 0; i<maxn; i++) sign[i] = i; } int get(int x) { if(x == sign[x]) return x; return sign[x] = get(sign[x]); } void unio(int x, int y)//合并敌对关系 { int a = get(x), b = get(y); sign[a] = b; } int cmp1(int x, int y)//判断两个人是不在同一个帮派 { if(get(x) == get(y+n) || get(y) == get(x+n))//如果两者为敌对关系,则返回1 return 1; return 0; } int cmp2(int x, int y)//判断两人在同一个帮派 { if(get(x) == get(y) || get(x+n) == get(y+n))//如果两个人不是敌对关系 return 1; return 0; } int main() { char bang; int a, b; scanf("%d", &t); for(int i = 0; i<t; i++) { init(); scanf("%d%d", &n, &m); for(int j = 0; j<m; j++) { scanf("%s%d%d",&bang,&a,&b); if(bang == 'D') { unio(a, b + n); unio(a + n,b); } else if(bang == 'A') { if(cmp1(a, b))//如果不在同一个帮派 printf("In different gangs.\n"); else if(cmp2(a,b))//如果在同一个帮派 printf("In the same gang.\n"); else//搜索不到 printf("Not sure yet.\n"); } } } return 0; }
转载于:https://www.cnblogs.com/RootVount/p/10539618.html