题意:给你N个点,N-1条边,通过删边建边将图变成一棵树,注:删边==建边。
分析:水题,并查集就行。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1010;
int pa[maxn];
struct Node{
int u,v;
}cut[maxn];
int Find(int x){
if(x!=pa[x]){
pa[x]=Find(pa[x]);
}
return pa[x];
}
void Union(int a,int b){
int x=Find(a);
int y=Find(b);
pa[x]=y;
}
int main(){
int n;
while(~scanf("%d",&n)){
int ans=0;
for(int i=0;i<=n;i++){
pa[i]=i;
}
for(int i=0;i<n-1;i++){
int a,b;
scanf("%d %d",&a,&b);
if(Find(a)==Find(b)){
cut[ans].u=a;
cut[ans].v=b;
ans++;
}
else{
Union(a,b);
}
}
printf("%d\n",ans);
int num=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(Find(i)!=Find(j)){
printf("%d %d %d %d\n",cut[num].u,cut[num].v,i,j);
Union(i,j);
num++;
if(num==ans) break;
}
}
}
}
}