做法:先确定各自的连通分量,然后再用并查集的方法,求出各自的连接方案
#include <iostream>
#include <cstdio>
#include <utility>
#include <vector>
#include <cstring>
const int LMT=1002;
using namespace std;
vector<pair<int,int> >back[LMT];
bool gra[LMT][LMT];
int n,pos,vis[LMT],gen[LMT],fa[LMT];
void dfs(int u,int pre)
{
vis[u]=1;
for(int j=0;j<n;j++)
if(gra[u][j])
{
if(vis[j]==1&&j!=pre)
back[pos].push_back(make_pair(u,j));
if(0==vis[j])dfs(j,u);
}
vis[u]=2;
}
int find(int x)
{
int f=fa[x];
while(f!=fa[f])f=fa[f];
fa[x]=f;
return f;
}
int main()
{
int a,b;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
a--;b--;
gra[a][b]=gra[b][a]=1;
}
for(int i=0;i<n;i++)
if(0==vis[i])
{
gen[pos]=i;
dfs(i,i);
pos++;
}
cout<<pos-1<<endl;
for(int i=0;i<pos;i++)fa[i]=i;
for(int i=0,j=0;i<pos;i++)
{
j=0;
while(!back[i].empty()&&j<pos)
{
a=find(j);b=find(i);
if(a!=b)
{
printf("%d %d %d %d\n",back[i].back().first+1,back[i].back().second+1,
back[i].back().first+1,gen[j]+1);
back[i].pop_back();
if(a<b)fa[b]=a;
else fa[a]=b;
}
j++;
}
}
return 0;
}