Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 42064 | Accepted: 12936 |
Description
Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Sample Output
Not sure yet. In different gangs. In the same gang.
Source
關係並查集
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 100000+10;
int f[N],rank[N];
int n,m;
void init() {
for(int i=1; i<=n; i++) {
f[i]=i;
rank[i]=0;
}
}
int find(int x) {
if(x==f[x]) return f[x];
int fa=f[x];
f[x] = find(f[x]); //路徑壓縮
rank[x] = (rank[x]+rank[fa])&1;
return f[x];
}
void Union(int x,int y) {
int a=find(x), b=find(y);
if(a==b) return ;
f[b] = a;
rank[b] = (rank[x]-rank[y]+1)&1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
init();
char ch;
int a,b;
while(m--) {
getchar();
scanf("%c%d%d",&ch,&a,&b);
if(ch=='D') {
Union(a,b);
} else {
int fa=find(a),fb=find(b);
if(fa==fb) {
if(rank[a]==rank[b])
printf("In the same gang.\n");
else
printf("In different gangs.\n");
} else
printf("Not sure yet.\n");
}
}
}
return 0;
}