HDU 1272 小希的迷宫

来源:互联网 发布:高仿包包淘宝上哪里买 编辑:程序博客网 时间:2024/05/16 02:50

题目大意:

中文题,题意不解释,同样是一道并查集的题,但是这道题里要判是否成环。


解题思路:

在并查集中我们如何判断是否成环呢?我们只要发现这两个点的根节点是同一个点,且这两个点之间有边,即可判断。

同时也要判断边数和点数之间的关系是不是edge+1=node


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 100005int fa[maxn];bool vis[maxn];void init(){    int i;    for(i=0;i<maxn;i++)        fa[i]=i;}int findfather(int x){    while(x!=fa[x]){x=fa[x];}    return fa[x];}int main(){    int a,b,i;    int flag,edge,node;    while(1)    {        init();        flag=1;        edge=node=0;        memset(vis,false,sizeof(vis));        while(scanf("%d%d",&a,&b)==2&&a!=-1&&b!=-1)        {            if(a==0&&b==0&&edge==0)            {                printf("Yes\n");                continue;            }            if(a==0&&b==0)                break;            edge++;            vis[a]=vis[b]=true;            if(flag)            {                a=findfather(a);                b=findfather(b);                if(a!=b)                    fa[a]=b;                else if(a==b)                    flag=0;            }        }        if(a==-1&&b==-1)            break;        for(i=0;i<maxn;i++)            if(vis[i])                node++;        if(flag&&node==edge+1)            printf("Yes\n");        else            printf("No\n");    }    return 0;}


0 0
原创粉丝点击