曾经写过一遍,不过这次似乎写得更加顺畅。
注意10^5,是多大……我竟然把MAX_SIZE定义小了一个数量级==!
/*
* find them, catch them
* mike-w
* 2012-4-28
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 123456
int T,N,M;
int diff[MAX_SIZE];
int set[MAX_SIZE],rank[MAX_SIZE];
int set_init(int size)
{
int i;
for(i=1;i<=size;i++)
set[i]=i,rank[i]=1;
return 0;
}
int set_find(int e)
{
if(set[e]==e)
return e;
else
return set[e]=set_find(set[e]);
}
int set_merge(int e1, int e2)
{
int r1=set_find(e1);
int r2=set_find(e2);
if(r1==r2)
return -1;
if(rank[r1]<rank[r2])
set[r1]=r2;
else if(rank[r1]>rank[r2])
set[r2]=r1;
else
set[r1]=r2,rank[r2]++;
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int r1,r2,c1,c2;
char buf[5];
const char str_same[]="In the same gang.";
const char str_diff[]="In different gangs.";
const char str_not_sure[]="Not sure yet.";
scanf("%d",&T);
while(T-->0)
{
scanf("%d%d",&N,&M);
memset(diff,0,sizeof(diff));
set_init(N);
if(N==2)
diff[1]=2;
while(M-->0)
{
scanf("%s%d%d",buf,&c1,&c2);
if(buf[0]=='A')
{
if(c1<=N && c2<=N)
r1=set_find(c1), r2=set_find(c2);
else
r1=r2=0;
if(r1==r2)
puts(str_same);
else if(set_find(diff[r1])==r2)
puts(str_diff);
else
puts(str_not_sure);
}
else
{
if(!diff[c1])
diff[c1]=c2;
else
set_merge(diff[c1],c2);
if(!diff[c2])
diff[c2]=c1;
else
set_merge(diff[c2],c1);
}
}
}
return 0;
}