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;
    }
  • 相关阅读:
    hdoj5813【构造】
    Codeforces645B【树状数组求逆序数】
    pojcoin【未完待续】
    hdoj5818【模拟】
    poj2385【基础DP】
    poj3069【贪心,水】
    谦虚
    poj3617【贪心】
    poj2229【完全背包-规律Orz...】
    poj3176【简单DP】
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2784854.html
Copyright © 2011-2022 走看看