关闭

hdu 1272 小希的迷宫(判断成环)

标签: 并查集判断成环
103人阅读 评论(0) 收藏 举报
分类:

题目链接: hdu 1272 小希的迷宫

题意:若整个无向图连通,并且不成环,则输出Yes,否则输出No

判断成环:

若两个点的祖宗相同,并且这两个点相连,则说明成环

整个无向图连通,表明只有一个根节点

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 111111
using namespace std;
int father[maxn];
int Find(int x)
{
    if(father[x]==x) return x;
    father[x]=Find(father[x]);
    return father[x];
}
int Merge(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x!=y) father[x]=y;
}
bool same(int x,int y)//判断是否成环
{
    return Find(x)==Find(y)?1:0;
}
int main()
{
  int x,y,flag = 0,Max=-1;
  while(scanf("%d%d",&x,&y))
  {
      Max=-1;//Max用来记录最大的那个数
      if(x==-1&&y==-1) break;
      if(x==0&&y==0)//大坑点,输入0,0时输出要是Yes
      {
          printf("Yes\n");
          continue;
      }
      flag = 0;
      memset(father,0,sizeof(father));//因为不知道哪些数有用,所以一开始不能初始化为本身
      do
      {
          if(!father[x]) father[x]=x;//输入的数即为有用的数,若该数的父亲为零,则表示以前没访问过,则初始化为它的本身
          if(!father[y]) father[y]=y;
          int Max1=max(x,y);
          Max=max(Max,Max1);//不断找最大值
          if(!same(x,y)) Merge(x,y);//若不是共同的祖先, 则合并
          else flag =1;//否则制标记为1
          scanf("%d%d",&x,&y);
      }while(x&&y);
      int sum=0;
      for(int i=1;i<=Max;i++)
        if(father[i]==i) sum++;
      if(sum!=1) flag =1;//若要全部连通,则根只有一个
     // cout<<sum<<endl;
      if(flag) printf("No\n");
      else printf("Yes\n");
  }
  return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17997次
    • 积分:1712
    • 等级:
    • 排名:千里之外
    • 原创:160篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    最新评论