题意:给你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; } } } } }