poj1308 并查集

比较恶心

1: 0 0 空树是一棵树
2: 1 1 0 0 不是树 
3: 1 2 1 2 0 0 不是树...
4: 1 2 2 3 4 5 不是树  森林不算是树
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1  错
6: 1 2 2 1 0 0 也是错误的

#include<stdio.h>
#include<string.h>
int pa[1010],a[1010],b[1010],n,in[1010],map[1010],hash[1010];
void init()
{
    for(int i=0;i<=n;i++)
    {
        pa[i]=i;
    }
}
int find(int x)
{
    if(x!=pa[x])
        pa[x]=find(pa[x]);
    return pa[x];
}
int main()
{
    int i,j,flag,ff=0;
    while(scanf("%d%d",&a[0],&b[0])!=EOF)
    {
        j=0;
        memset(hash,0,sizeof(hash));
        memset(map,0,sizeof(map));
        memset(in,0,sizeof(in));
        if(!hash[a[0]])
            map[j++]=a[0];
        if(!hash[b[0]])
            map[j++]=b[0];
        if(a[0]==0&&b[0]==0)
        {
            printf("Case %d is a tree.\n",++ff);
            continue;
        }
        n=0;
        flag=1;
        if(a[0]<0&&b[0]<0)
            break;
        in[a[0]]++,in[b[0]]++;
        if(a[0] > n) n = a[0];
        if(b[0] > n) n = b[0];
        i=0;
        while(1)
        {
            i++;
            scanf("%d %d",&a[i],&b[i]);
            if(a[i]==0&&b[i]==0)
                break;
            if(!hash[a[i]])
            {
                hash[a[i]]=1;
                map[j++]=a[i];
            }
            if(!hash[b[i]])
            {
                map[j++]=b[i];
                hash[b[i]]=1;
            }
            if(a[i] > n) n = a[i];
            if(b[i] > n) n = b[i];
        }
        int num=j;
        //for(j=0;j<num;j++)
        //    printf("%d ",map[j]);
        //printf("\n");
        int len=i;
        init();
        for(i=0;i<len;i++)
        {
            int x,y;
            x=find(a[i]);
            y=find(b[i]);
            if(x!=y)
            {
                pa[x]=y;
            }
            else 
                flag=0;
        }
        int ans=0;
        for(i=0;i<num;i++)
        {
            if(pa[map[i]]==map[i])
            {
                ans++;
            }
        }
        if(ans>1)
            flag=0;
        if(flag)
            printf("Case %d is a tree.\n",++ff);
        else 
            printf("Case %d is not a tree.\n",++ff);
    }
}

 

posted @ 2015-07-28 10:31  sweat123  阅读(224)  评论(0编辑  收藏  举报