http://acm.hdu.edu.cn/showproblem.php?pid=3926
用并查集合并,得到若干个集合,比较两个图中集合是否完全相同,包括集合的个数,集合中点的个数,集合中点的构成是链还是环。
const int Max_N = 10008 ;
struct Graph{
int son ;
int is_ring ;
friend bool operator < (const Graph &A , const Graph &B){
if(A.son != B.son)
return A.son < B.son ;
else
return A.is_ring < B.is_ring ;
}
};
Graph g1[Max_N] , g2[Max_N] ;
int find_father(int x , int father[]){
if(x == father[x])
return x ;
else
return father[x] = find_father(father[x] , father) ;
}
void Merg(int x , int y , int father[] , Graph g[]){
int f_x = find_father(x , father) ;
int f_y = find_father(y , father) ;
if(f_x == f_y){
g[f_x].is_ring = 1 ;
return ;
}
if(g[f_x].son >= g[f_y].son){
father[f_y] = f_x ;
g[f_x].son += g[f_y].son ;
}
else{
father[f_x] = f_y ;
g[f_y].son += g[f_x].son ;
}
}
int N ;
int father1[Max_N] , father2[Max_N] ;
void Init(){
for(int i = 1 ; i <= N ; i++){
father1[i] = father2[i] = i ;
g1[i].son = g2[i].son = 1 ;
g1[i].is_ring = g2[i].is_ring = 0 ;
}
}
int Judge(){
sort(g1+1 , g1+1+N) ;
sort(g2+1 , g2+1+N) ;
for(int i = 1 ; i <= N ; i++){
if(g1[i].son != g2[i].son ||(g1[i].son == g2[i].son && g1[i].is_ring != g2[i].is_ring))
return 0 ;
}
return 1 ;
}
int main(){
int T , i , u , v ,M , k = 1 ;
cin>>T ;
while(T--){
scanf("%d%d" ,&N ,&M) ;
Init() ;
for(i = 1 ; i <= M ; i++){
scanf("%d%d" ,&u ,&v) ;
Merg(u , v ,father1 , g1) ;
}
scanf("%d%d" ,&N ,&M) ;
for(i = 1 ; i <= M ; i++){
scanf("%d%d" ,&u ,&v) ;
Merg(u , v ,father2 , g2) ;
}
printf("Case #%d: %s\n", k++ , Judge() ? "YES" : "NO");
}
return 0 ;
}