HDU - 3926 Hand in Hand (两个并查集同构)

题意:

有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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值