题意:
给你n个点,n-1条边,可能会产生回路。
每次你可以删一条边,并且增加任意一条边。
问你最少进行几次操作
POINT:
并差集检测出回路的边都删。
增加边就很简单。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn = 1111;
#define LL long long
int fa[maxn];
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct node
{
int u,v;
}len[maxn],newbuild[maxn];
int main()
{
int n;
scanf("%d",&n);
int t=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<n;i++){
int u,v;
scanf("%d %d",&u,&v);
int uu=find(u);
int vv=find(v);
if(uu!=vv){
fa[vv]=uu;
}else{
len[++t].u=u;
len[t].v=v;
}
}
printf("%d\n",t);
int cnt=0;
for(int i=2;i<=n;i++){
int uu=find(1);
int vv=find(i);
if(uu!=vv){
fa[vv]=uu;
newbuild[++cnt].u=1;
newbuild[cnt].v=i;
}
}
for(int i=1;i<=cnt;i++){
printf("%d %d %d %d\n",len[i].u,len[i].v,newbuild[i].u,newbuild[i].v);
}
}