HDU 1272 小希的迷宫

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1272

并查集的简单应用

解题思路:题目意思是找到判断是不是连通无环的图,首先想到的就是并查集。

              1判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。

              2判断连通的时候,只要判断根节点数为1即可。

             注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。

View Code
 1  #include<iostream>
 2  using namespace std;
 3  #define MAX 100005
 4  int father[MAX],flag,sign[MAX];
 5  
 6  int FindSet(int x)
 7  {
 8      while(x!=father[x])
 9          x=father[x];
10      return x;
11  }
12  
13  void Union(int x,int y)
14  {
15      x=FindSet(x);
16      y=FindSet(y);
17      if(x!=y)
18          father[x]=y;
19      else flag=0; //同父节点,成环
20  }
21  
22  int main()
23  {
24      int i,a,b;
25      while(cin>>a>>b)
26      {
27          if(a==-1&&b==-1) break;
28          if(a==0&&b==0)
29          { cout<<"Yes"<<endl; continue; }
30          for(i=1;i<MAX;i++) 
31          {
32              father[i]=i;
33              sign[i]=0;
34          }
35          sign[a]=sign[b]=1;
36          flag=1;
37          Union(a,b);
38          while(cin>>a>>b)
39          {
40              if(a==0&&b==0) break;
41              Union(a,b);
42              sign[a]=sign[b]=1;
43          }
44          int k=0;
45          for(i=1;i<MAX;i++)
46          {
47              if(sign[i]&&father[i]==i) //判断根节点k数目
48                  k++; 
49              if(k>1) flag=0;
50          }
51          if(flag) cout<<"Yes"<<endl;
52          else cout<<"No"<<endl;
53      }
54      return 0;
55  }

 

 

posted @ 2012-08-03 18:04  时光旅行的懒猫  阅读(386)  评论(0编辑  收藏  举报