poj 1308 Is It A Tree? (最小生成树)

点击打开链接

最小生成树。。

#include"stdio.h"
int set[1002],v[1003],cnt[1002],flag;
void fun()
{
    int i;
    flag=0;
    for(i=1;i<=1000;i++)
    {
        set[i]=i;
        v[i]=0;
        cnt[i]=0;
    }
}
int find(int x)
{
    return set[x]==x?x:find(set[x]);
}
int ffun()
{
    int i,t;
    for(i=1;i<=1000;i++)
    {
        if(v[i])
            cnt[find(i)]++;
    }
    t=0;
    for(i=1;i<=1000;i++)
    {
        if(cnt[i]>1) t++;
    }
    if(t>1) return -1;
    else return 1;
}
int main()
{
    int a,b,num;
    fun();num=0;
    while(scanf("%d%d",&a,&b))
    {
        if(a<0) break;
        if(a==0&&b==0)
        {
            num++;
            if(flag)
                printf("Case %d is not a tree.\n",num);
            if(!flag)
            {
                if(ffun()==1) printf("Case %d is a tree.\n",num);
                else printf("Case %d is not a tree.\n",num);
            }
            fun();
            continue;
        }
        v[a]=v[b]=1;
        if(find(a)==find(b)||find(b)!=b)//这里注意find(b)!=b不能忘,是为了防止
            flag=1;
        else set[b]=a;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yyf573462811/p/6365307.html