题目链接
题目大意:
有 n 个城市 有 n-1 条路 但不满足任意一个城市可以到达另一个城市 所以要修 新路 顺便 拆旧路
修一条新路的同时需要拆一条旧路 用时一天 问最少需要几天
解题思路:
并查集
输入旧路的同时 找父亲节点 如果这俩城市同一个父亲节点 那这条旧路是可拆的
不是同一个父亲节点 就合并下 这样以后也是同一个人父亲节点了
输入结束后 看有几个 组织 也就是有几个点的父亲节点是自己 它们都是独立的 在它们两两之间修路即可
代码如下:
#include<iostream>
using namespace std;
const int maxn=1e4+10;
int f[maxn];
int a[maxn];
int u[maxn];
int v[maxn];
int find(int x)
{
if(x==f[x])
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
int main()
{
int n,i,j,k=0;
int xx,yy,x,y;
int ans=0;
cin>>n;
for(i=0;i<=n;i++)
f[i]=i;
for(i=0;i<n-1;i++)
{
cin>>x>>y;
xx=find(x);
yy=find(y);
if(xx==yy)
{
k++;
u[k]=x;
v[k]=y;
}
else
{
f[xx]=yy;
}
}
for(i=1;i<=n;i++)
{
if(f[i]==i)
{
ans++;
a[ans]=i;
}
}
cout<<ans-1<<endl;
for(i=1;i<ans;i++)
{
cout<<u[i]<<" "<<v[i]<<" ";
cout<<a[i]<<" "<<a[i+1]<<endl;
}
return 0;
}