• 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.
    ",++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("
    ");
            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.
    ",++ff);
            else 
                printf("Case %d is not a tree.
    ",++ff);
        }
    }
  • 相关阅读:
    About unsign in Java
    Heart Shape Function
    Java内存分配与垃圾回收的关系
    Android Volume Button Listener
    Android Opensource Lib
    Android Lock Screen Orientation
    JS moveStart和moveEnd方法(TextRange对象查找与选择)
    一个简单的遮罩层效果
    IE中的条件注释(<![if lt IE 7]><![endif]>)
    document.execCommand()用法说明
  • 原文地址:https://www.cnblogs.com/sweat123/p/4682093.html
Copyright © 2020-2023  润新知