Mocha and Diana (Easy Version)题解报告

Mocha and Diana (Easy Version)题解报告

标签:并查集 无向图

题目链接

题意:

Mocha 和 Diana都有一片森林,输入给出n, m1 and m2 (1≤n≤1000, 0≤m1,m2<n)
表示两人分别有n个节点,
下面m1行给出两个数字a,b,表示mocha的a节点与b节点,后m2行则描述Diana
在样例中我们可以得到如下无向图
在这里插入图片描述
随后让我们自定义同时连接两人图中的x和y节点,要求不能在图中出现环,问我们最多能再原图上连续添加几根,同时输出所连两端节点。
在这里插入图片描述

解题思路:

一颗树有多少边是确定的(节点数-1)
显然不可以连接树上两点,而只能连接树与树之间
只有当所连x,y节点,在两人图中都分别属于不同的树才能满足条件
题目所给的n较小,可以通过直接枚举连接任何两个点的情况来判断
另外为了减少迭代浪费的时间,我们将节点直接同根节点相连,而不是一次通过父亲节点查询到根节点

代码实现:

#include <iostream>
using namespace std;
int fa1[1005],fa2[1005];
int ans[1005][2];
int find1(int x){
	if(fa1[x]==x)
	return x;
	else{
		fa1[x]=find1(fa1[x]); 
		return fa1[x];
	}
}

int find2(int x){
	if(fa2[x]==x)
	return x;
	else{
		fa2[x]=find2(fa2[x]); 
		return fa2[x];
	}
}

int main(){
	int n,m1,m2;
	int cnt,i,j;
	int x,y;
	cin>>n>>m1>>m2;
	for(i=1;i<=n;i++){
		fa1[i]=i;
		fa2[i]=i;
	}
	
	for(i=1;i<=m1;i++){
		cin>>x>>y;
		if(find1(x)!=find1(y))
		fa1[find1(x)]=find1(y);
	}
	for(i=1;i<=m2;i++){
		cin>>x>>y;
		if(find2(x)!=find2(y))
		fa2[find2(x)]=find2(y);
	}	
	
	cnt=0;
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++){
		int x1=find1(i);
		int y1=find1(j);
		int x2=find2(i);
		int y2=find2(j);	
		if(x1!=y1&&x2!=y2){
			ans[cnt][0]=i;
			ans[cnt][1]=j;
			cnt++;
			fa1[x1]=y1;
			fa2[x2]=y2;
		}
	}
	
	cout<<cnt<<endl;
	for(i=0;i<cnt;i++)
	cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值