题意:
有T组数据, 每组数据中又有两组数据,问你这两组数据是不是同构的。
思路:
在并查集合并的时候,把每个并查集的所含有的边记录一下,
最后一一对比,集合的个数是不是一样的,集合中的边是不是一样的。
#include <bits/stdc++.h>
#define mem(x,v) memset(x,v,sizeof(x))
#define go(i,a,b) for (int i = a; i <= b; i++)
#define og(i,a,b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long LL;
const double EPS = 1e-10;
const int INF = 0x3f3f3f3f;
const int N = 1e4+10;
int s[N],t[N],fs,ft;
int f[N],n,m,c[N];
int find(int k ){
if (f[k] == k) return k; else return f[k] = find(f[k]);
}
void slove(){
int x,y,xx,yy;
mem(c,0);
scanf("%d%d",&n,&m);
go(i,0,n) f[i] = i;
go(i,1,m) {
scanf("%d%d",&x,&y);
xx = find(x); yy = find(y);
if (xx != yy) f[xx] = yy,c[yy] += c[xx] + 1; else c[yy]++;
}
go(i,1,n) if(find(i) != i) c[i]=0;
}
int main(){
int T,num = 1; cin>>T;
while(T--){
fs = ft = 0;
slove();
go(i,1,n) if(c[i] > 0) s[fs++] = c[i];
sort(s,s+fs);
slove();
go(i,1,n)
if (c[i]> 0) t[ft++] = c[i];
sort(t,t+ft);
bool flag = 0;
if (fs != ft) flag = 1;
go(i,0,fs-1) {
if (s[i] != t[i]) flag = 1;
if (flag) break;
}
if (flag) printf("Case #%d: NO\n",num++); else
printf("Case #%d: YES\n",num++);
}
return 0;
}