HDU--1272

题目:

小希的迷宫

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

分析:并查集的应用。判断有无环以及是否都在一个集合里即可!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define maxn 100005
 7 #define ll long long
 8 #define inf 0x7fffffff
 9 using namespace std;
10 int fa[maxn],vis[maxn];
11 void make_set()
12 {
13     for(int i=0;i<maxn;i++)
14     fa[i]=i;
15 }
16 int find_fa(int x)
17 {
18      if(fa[x]==x)return x;
19      else return fa[x]=find_fa(fa[x]);
20 }
21 void Union(int x,int y)
22 {
23     fa[y]=x;
24 }
25 int main()
26 {
27      int a,b,son,ori;
28      while(scanf("%d%d",&a,&b)==2)
29      {
30          if(a==-1&&b==-1)break;
31          if(a==0&&b==0)
32          {
33                puts("Yes");
34                continue;
35          }
36          memset(vis,0,sizeof(vis));
37          int flag=0;
38          make_set();
39          fa[b]=a;
40          son=b;
41          vis[a]=1;vis[b]=1;
42          while(1)
43          {
44               scanf("%d%d",&a,&b);
45               if(a==0&&b==0)break;
46               if(flag)continue;
47               int nx=find_fa(a);
48               int ny=find_fa(b);
49               if(nx==ny)flag=1;
50               else if(nx!=ny)
51               {
52                   Union(nx,ny);
53                   vis[a]=1;vis[b]=1;
54               }
55          }
56          if(!flag)
57          {
58               ori=find_fa(son);
59             for(int i=0;i<maxn;i++)
60              if(vis[i])
61              {
62                  if(find_fa(i)!=ori)
63                  {
64                      flag=1;break;
65                  }
66              }
67          }
68          if(flag)printf("No\n");
69          else printf("Yes\n");
70      }
71     return 0;
72 }
View Code

 

posted @ 2013-09-28 21:29  EtheGreat  阅读(190)  评论(0编辑  收藏  举报