小希的迷宫(并查集)

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

思路:

所求的图满足两点要求:(1) 连通 (2) 不存在环 。

而这两点用并查集都能判断。注意本题中 输入 0 0时,应输出 Yes。

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N=100002;
 4 int f[N],vis[N];
 5 void init()
 6 {
 7     for (int i = 1; i <= N; i ++)
 8     {
 9         f[i] = i;
10         vis[i] = 0;
11     }
12 
13 }
14 int find(int x)
15 {
16     if (x!=f[x])
17         f[x] = find(f[x]);
18     return f[x];
19 }
20 void merge(int x,int y)
21 {
22     x = find(x);
23     y = find(y);
24     if (x!=y)
25         f[x] = y;
26 }
27 int main()
28 {
29     int u,v;
30     while(1)
31     {
32         int cnt = 0;
33         int flag = 1;
34         init();
35         while(~scanf("%d%d",&u,&v))
36         {
37             if (u==0&&v==0||u==-1&&v==-1)
38                 break;
39             vis[u] = 1;
40             vis[v] = 1;
41             if(find(u)==find(v))//判环
42             {
43                 flag = 0;
44             }
45             else
46                 merge(u,v);
47         }
48         if (u==-1&&v==-1)
49             break;
50         for (int i = 0; i <= N; i ++)//判连通性
51         {
52             if (vis[i]&&f[i]==i)
53                 cnt ++;
54         }
55         if (cnt<=1&&flag)
56             printf("Yes\n");
57         else
58             printf("No\n");
59     }
60     return 0;
61 }
View Code

 

 

posted @ 2013-09-12 17:04  N_ll  阅读(172)  评论(0编辑  收藏  举报