题意:T代表case数量,N代表N个人,M代表将要输入M组关系,每组关系有一个字符和两个整数ch,A,B,如果ch是‘A’,代表询问A,B是否是同一集合,‘D’代表A和B是同一集合
题解:并查集
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std ;
const int INF = 99999999 ;
const int MAXN = 100005 ;
int father[MAXN] ;
int rank[MAXN] ;
int find( int x )
{
if( father[x] == x ) return x ;
int t = father[x] ;
father[x] = find( father[x] ) ;
rank[x] = ( rank[x] + rank[t] ) % 2 ;
return father[x] ;
}
void Union( int a , int b )
{
int f1 = find( a ) ;
int f2 = find( b ) ;
if( f1 != f2 ) {
father[f1] = f2 ;
if( ( rank[a] + rank[b] ) % 2 == 0 ) rank[f1] = 1 ;
}
}
int main()
{
int T , M , N ;
int a , b , i ;
char ch ;
scanf( "%d" , & T ) ;
while( T -- )
{
scanf( "%d%d" , & N , & M ) ;
getchar() ;
for( i = 1 ; i <= N ; i ++ ) {
father[i] = i ;
rank[i] = 0 ;
}
while( M -- )
{
scanf( "%c%d%d" , &ch , & a , & b ) ;
getchar() ;
if( ch == 'D' ) Union( a , b ) ;
else{
int f1 = find( a ) ;
int f2 = find( b ) ;
if( f1 == f2 && rank[a] == rank[b] ) printf( "In the same gang.\n" ) ;
else if( f1 == f2 ) printf( "In different gangs.\n" ) ;
else printf( "Not sure yet.\n" ) ;
}
}
}
return 0 ;
}