思路:非常暴力的题,首先先把Mocha和Diana分别自己的边处理好并查集。
然后枚举所有边,如果可以加到Mocha也可以加到Diana就加上,否则不加。
#include<cstring>
#include<math.h>
#include<iostream>
#include <climits>
using namespace std;
typedef long long LL;
int p1[100005],p2[100005];
int find(int p[],int x){
if(x!=p[x])p[x]=find(p,p[x]);
return p[x];
}
struct Edge{
int u,v;
}e[1000005];
int main()
{
int n,m1,m2;
scanf("%d%d%d",&n,&m1,&m2);
for(int i=1;i<=n;i++)p1[i]=p2[i]=i;
for(int i=1;i<=m1;i++){
int u,v;
scanf("%d%d",&u,&v);
int px1=find(p1,u),px2=find(p1,v);
if(px1!=px2){
p1[px1]=px2;
}
}
for(int i=1;i<=m2;i++){
int u,v;
scanf("%d%d",&u,&v);
int px1=find(p2,u),px2=find(p2,v);
if(px1!=px2){
p2[px1]=px2;
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int px1=find(p1,i),px2=find(p2,i),py1=find(p1,j),py2=find(p2,j);
if(px1!=py1&&px2!=py2){
p1[px1]=py1;
p2[px2]=py2;
++ans;
e[ans]={i,j};
}
}
}
printf("%d\n",ans);
for(int i=1;i<=ans;i++){
printf("%d %d\n",e[i].u,e[i].v);
}
return 0;
}