zoukankan      html  css  js  c++  java
  • hdu 1272 小希的迷宫

    并查集裸题,可以用来学习并查集的性质

    1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环

    2.整个祖先数组中p[i]=i个个数就是连通分量的个数

    题目要求:

    1.若没哟普任何边直接输入0 0 要输出Yes

    2.若成环,No

    3.不管是否成环,图不连通,No

    4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管

    #include <cstdio>
    #include <cstring>
    #define N 100010
    int p[N],use[N];
    
    int find(int x)
    {
        while(x!=p[x])
            x=p[x];
        return x;
    }
    
    int main()
    {
        int u,v,x,y,OK;
        while(1)
        {
            OK=1;
            scanf("%d%d",&u,&v);
            if(u==-1 && v==-1)
                break;
            else if(u==0 && v==0)
                printf("Yes\n");
            else
            {
                for(int i=1; i<N; i++)
                { p[i]=i; use[i]=0; }
                use[u]=use[v]=1;
                x=find(u);
                y=find(v);
                if(x!=y)
                    p[x]=y;
                else
                {
                    printf("No\n");
                    continue;
                }
                while(1)
                {
                    scanf("%d%d",&u,&v);
                    if(u==0 && v==0) break;
                    use[u]=use[v]=1;
                    x=find(u);
                    y=find(v);
                    if(x!=y)
                        p[x]=y;
                    else
                        OK=0;
                }
                int count=0;
                for(int i=1; i<N; i++)
                    if(use[i] && p[i]==i)
                        count++;
                if(count>1) OK=0;
                if(OK) printf("Yes\n");
                else   printf("No\n");
            }
        }
        return 0;
    }
  • 相关阅读:
    【LVS 】NAT方式实现过程
    【 LVS 】类型及算法
    [ 总结 ] RHEL6/Centos6 使用OpenLDAP集中管理用户帐号
    [ 手记 ] 关于tomcat开机启动设置问题
    [ 总结 ] nginx 负载均衡 及 缓存
    Mac
    Swift
    Swift
    Cocoapods
    Swift
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2784854.html
Copyright © 2011-2022 走看看