CodeForces 25D Roads not only in Berland

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


猜你喜欢

转载自blog.csdn.net/u012117299/article/details/17172343