臭道人

2.25

http://acm.hdu.edu.cn/showproblem.php?pid=1272 

小希的迷宫,第一个做的 并查集的环问题

merge 里面的fa==fb的时候会产生环

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int pre[N],cnt,i,j,flag;
int f(int x)
{
    return x==pre[x]?x:f(pre[x]);
}
void merge(int a,int b)
{
    int fa=f(a),fb=f(b);
    fa==fb?flag=1:pre[fa]=fb;
}
int main()
{
    int a,b;
    while(1)
    {
        memset(pre,0,sizeof(pre));
        flag=0;
        cnt=0;
        while(scanf("%d%d",&a,&b)&&a&&b)
        {
            if(a==-1&&b==-1)
                return 0;
            if(pre[a]==0)
                pre[a]=a;
            if(pre[b]==0)
                pre[b]=b;
            merge(a,b);
        }
        for(i=1;i<N;i++)
            if(pre[i]==i)
                cnt++;
        if(cnt>1||flag)
            printf("No\n");
        else printf("Yes\n"); 
    }
}
View Code

 

posted on 2021-02-25 03:23  臭总  阅读(58)  评论(0编辑  收藏  举报

导航