hdu 1272 并查集

题目大意:给一个图,不能出现环,而且只能有一个联通子图。

好惆怅,又是爆栈又是wrong answer的。

#include<iostream>
#include<cstdio>
using namespace std;

const int maxn=100005;
int f[maxn],ans;
bool v[maxn];

void init(){for(int i=1;i<=100000;i++) f[i]=i,v[i]=0;}

int findset(int x){ return f[x]!=x?f[x]=findset(f[x]):f[x];}

void merge(int a,int b)
{
    int fa=findset(a);
    int fb=findset(b);
    if(fa==fb) ans=1;
    if(fa>fb) f[fa]=fb;
    else f[fb]=fa;
}

int main()
{
    int a,b,i,sum;
    while(scanf("%d %d",&a,&b) && !(a==-1 && b==-1))
    {
        ans=0;
        init();
        while(1)
        { 
            if(a==0 && b==0) break;
            merge(a,b);v[a]=v[b]=1;
            scanf("%d %d",&a,&b);
        }
        if(ans){ printf("No
");continue;}
        sum = 0;  
        for(i = 1; i <= 100000; i++)  
        if(v[i] && f[i] == i)  
            sum++;  
        if(sum > 1)  
            printf("No
");  
        else  
            printf("Yes
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiong-/p/3583352.html