有n个点n-1条边,删除某些边再增加某些边使图联通。只用并查集即可,输入边的时候把两个点合并,如果两个点已在一个集合,则删除这条边。然后把所有和1不是一个集合的点连一条向1的边,并合并。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
int n;
int l[1005],r[1005],l1,r1,a[1005],b[1005];
int f[1005];
int fd(int i)
{
if(f[i]==i) return i;
return f[i]=fd(f[i]);
}
int main()
{
int i,j,k,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<n;i++)
{
scanf("%d%d",&l1,&r1);
int ll=fd(l1),rr=fd(r1);
if(ll==rr)
{
l[++cnt]=l1;r[cnt]=r1;
}
else
f[rr]=ll;
}
int now=fd(1),tot=0;
for(i=2;i<=n;i++)
{
if(fd(i)!=now)
{
a[++tot]=i;
b[tot]=1;
f[fd(i)]=now;
}
}
printf("%d\n",cnt);
for(i=1;i<=cnt;i++)
{
printf("%d %d %d %d\n",l[i],r[i],a[i],b[i]);
}
return 0;
}