HDU 1272 小希的迷宫(并查集 + 判断是否有回路)

来源:互联网 发布:英语台词 软件 编辑:程序博客网 时间:2024/05/18 12:02

题目分析: 题目的意思就是判断一个图中的每两个点是否连同,且图中没有回路

算法分析:先用并查集判断这个图是不是有多个连通块,然后只需判断  边数是否等于顶点数-1  即可,这个题有一个比较坑的点就是  当输入为  0  0  的时候  也要输出 Yes

代码:

#include <cstdio>#include <cstring>int bin[100005];int used[100005];int edge;int findx(int x){    int r=x;    while (bin[r]!=r)        r=bin[r];    return r;}void merge(int x,int y){    int fx,fy;    fx=findx(x);    fy=findx(y);    if (fx!=fy)      bin[fx]=fy;}int main(){    //freopen("1.txt","r",stdin);    int num,maxn;    int sum;    int a,b;    while (scanf("%d%d",&a,&b)==2 && a!=-1 && b!=-1)    {        if (a==0 && b==0)        {            printf("Yes\n");            continue;        }        memset(used,0,sizeof(used));        maxn=-1;        num=0;        sum=0;        for (int i=1;i<=100004;i++)            bin[i]=i;        edge=1;        if (a>maxn) maxn=a;            if (b>maxn) maxn=b;            used[a]=1;            used[b]=1;        merge(a,b);        while (scanf("%d%d",&a,&b)==2 && a!=0 && b!=0)        {            merge(a,b);            if (a>maxn) maxn=a;            if (b>maxn) maxn=b;            used[a]=1;            used[b]=1;            edge++;        }        for (int i=1;i<=maxn;i++)            if (used[i]==1)            {//                printf("%d ",i);                sum++;            }//        printf("\n");        for (int i=1;i<=sum;i++)            if (bin[i]==i && used[i]==1) num++;//        printf("num=%d ",num);//        printf("edge=%d ",edge);//        printf("sum=%d \n",sum);        if (num!=1) printf("No\n");        else        {           if (edge==sum-1) printf("Yes\n");            else printf("No\n");        }     }    return 0;}

0 0