hdu 1272 小希的迷宫 并查集

来源:互联网 发布:剑雨江湖10进阶数据 编辑:程序博客网 时间:2024/06/03 06:01

题意:给你任意多的两个点,让你判断从一个点到另一个点是不是只有唯一的一条路径

思路:只要是两个点的根节点是一样的,说明已经成环了,至少有两种方式进行遍历了,所以肯定是不行的。而且并不是所有的点都是被用到的 ,所以需要判断一下是不是所有的点是不是在一个联通分量里面。

#include<iostream>#include<stdio.h>using namespace std;const int N = 100005;int flag[N];int father[N];void init(){    for(int i = 0; i <= 100000; i++)        flag[i] = 0, father[i] = i;}int Find(int x){    if(x != father[x])        father[x] = Find(father[x]);    return father[x];    }void Union (int a, int b){    int aroot  = Find(a);    int broot  = Find(b);    if(broot  > aroot)        father[aroot] = broot;    else        father[broot] = aroot ;}int main(){    int a, b;    while(~scanf("%d%d",&a,&b))    {        if(a == -1 && b == -1)            break;        init();        int Flag = 0;        while(1)        {            if(a == 0 && b == 0)                break;            if(Find(a) == Find(b))                Flag = 1;            Union(a,b);            flag[a] = 1, flag[b] = 1;            scanf("%d%d",&a,&b);        }        //for(int i = 0 ; i <=10 ;i++){cout<<father[i]<<endl;}        if(Flag == 1)            printf("No\n");        else        {            int sum = 0;            for(int i = 0; i <= 100000; i++)                if(flag[i] && father[i] == i)                    sum++;            if(sum > 1)                printf("No\n");            else                printf("Yes\n");        }    }    return 0;}

intf("Yes\n"); } } return 0;}

原创粉丝点击