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