【HDU 1272】【并查集】小希的迷宫

抱歉,我也忘记什么思路了。。。下次我。。如果

。。。。还记得。。。。

就补上。。现在我下自习了。。。


#include "stdio.h"
int pre[100001],max;
int flag,a[100001],b[100001];
int find(int x);
void join(int x,int y);
int main(int argc, char const *argv[])
{
    int i,k,m;
    while(~scanf("%d%d",&a[1],&b[1]))
    {
        max=-1;
        if(a[1]==-1 && b[1]==-1) break;
        if(a[1]==0 && b[1]==0)  printf("Yes\n");
        if(a[1]>max) max=a[1];
        if(b[1]>max) max=b[1];
        k=2;
        while(~scanf("%d%d",&a[k],&b[k]))
        {
            if(a[k]==0 && b[k]==0) break;
             if(a[k]>max) max=a[k];
             if(b[k]>max) max=b[k];
           k++;
        }
       for(i=1;i<=max;i++)
             pre[i]=i;
        flag=0;
        for(i=1;i<k;i++)
                 join(a[i],b[i]);
        if(flag) printf("No\n");
        else
        {
            m=find(a[1]);
            for(i=1;i<k;i++)
            {
                if(find(a[i])!=m||find(b[i])!=m)  
                {
                  flag=1;break;
                }
            }
            if(flag) printf("No\n");
            else printf("Yes\n");
        }
    }
    return 0;
}
int find(int x)
{
    return pre[x]==x?x:find(pre[x]);
}
void join(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
        pre[fx]=fy;
    else flag=1;
}


你可能感兴趣的:(c,并查集)