HDU 1272 小希的迷宫(并查集)

来源:互联网 发布:windows搭建ss教程 编辑:程序博客网 时间:2024/06/07 02:33




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






分析:

1、判断是否成环

2、判断是否连通

如何判断成环  即两个连通的点有相同的公共结点时   此时成环

这个输入输出格式 只能  Orz





AC代码:

#include <stdio.h>#include <string.h>#include <algorithm> using namespace std;int pre[100005];int num[100005];//      用于标记出现的点 int find(int n){    int r=n;    while (pre[r]!=r){        r=pre[r];    }    int i=n;    int temp;    while (i!=r){        temp=pre[i];        pre[i]=r;        i=temp;    }        return r;}int jion(int x,int y){    int fx=find(x);    int fy=find(y);        if (fx!=fy)        pre[fx]=fy;    else        return 0;//     两点有公共结点  成环     return 1;}void init(){//           初始化     for (int i=0;i<=100001;i++)        pre[i]=i;}int main (){    int a,b;    int len=0;    int flag=1;    int maxn=-1;    init();    memset(num,0,sizeof(num));    while (scanf ("%d%d",&a,&b)&&(a!=-1&&b!=-1)){        if(a!=0&&b!=0){            num[a]=1;//         点出现             num[b]=1;            maxn=max(max(a,b),maxn);//           点中的最大值             if(!jion(a,b))            flag=0;        }        if(a==0&&b==0){//                       int sum=0;            for (int i=1;i<=maxn;i++){                if (num[i])//          找到出现的点                     if(find(i)==i)                         sum++;                     }            if(sum>1)//    有多个根节点  不连通                 flag=0;            if(flag)                printf ("Yes\n");            else                 printf ("No\n");             flag=1;            maxn=-1;            init();            memset(num,0,sizeof(num));         }              }        return 0;}


原创粉丝点击