H - Roads not only in Berland
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice CodeForces 25D
Description
Berland Government decided to improve relations with neighboring countries. First of all, it was decided to build new roads so that from each city of Berland and neighboring countries it became possible to reach all the others. There are n cities in Berland and neighboring countries in total and exactly n - 1
Input
The first line contains integer n (2 ≤ n ≤ 1000) — amount of cities in Berland and neighboring countries. Next n - 1 lines contain the description of roads. Each road is described by two space-separated integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — pair of cities, which the road connects. It can't be more than one road between a pair of cities. No road connects the city with itself.
Output
Output the answer, number t — what is the least amount of days needed to rebuild roads so that from each city it became possible to reach all the others. Then output t lines — the plan of closure of old roads and building of new ones. Each line should describe one day in the format i j u v — it means that road between cities i and j became closed and a new road between cities u and v
Sample Input
Input
2
1 2
Output
0
Input
7
1 2
2 3
3 1
4 5
5 6
6 7
Output
1
3 1 3 7
这道题目是简单的并查集应用,直接给出AC代码
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
int father[1005];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
struct Node
{
int x,y;
}c[1005];
int num;
int tag[1005];
int res[1005];
int main()
{
int n;
int a,b;
scanf("%d",&n);
for(int i=1;i<=1000;i++)
father[i]=i;
int cnt=0;int num=0;
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&a,&b);
int fa=find(a);
int fb=find(b);
if(fa!=fb)
{
father[fa]=fb;
}
else
{
c[cnt].x=a;
c[cnt++].y=b;
}
}
memset(tag,0,sizeof(tag));
int cot=0;
for(int i=1;i<=n;i++)
{
if(!tag[find(i)])
{
res[cot++]=find(i);
num++;
tag[find(i)]=1;
}
}
printf("%d\n",num-1);
int tot=1;
for(int i=0;i<num-1;i++)
{
printf("%d %d",c[i].x,c[i].y);
printf(" %d %d\n",res[0],res[tot]);
tot++;
}
return 0;
}