首页 > 技术文章 > hdu 1272 小希的迷宫(并查集)

cxbky 2015-10-19 19:55 原文

Problem Description
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。 
 

 

Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。 
整个文件以两个-1结尾。
 

 

Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
 

 

Sample Input
6 8   5 3  5 2   6 4
5 6 0 0
 
8 1   7 3  6 2  8 9  7 5
7 4   7 8  7 6  0 0
 
 
3 8   6 8   6 4
5 3   5 6  5 2   0 0
 
-1 -1
 

 

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

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

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

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

 
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int set[100005];
 7 bool vis[100005];
 8 bool flag;
 9 int find(int x)
10 {
11     int r=x;
12     while(set[r]!=r)
13         r=set[r];
14     return r;
15 }
16 int main()
17 {
18     int a,b;
19     int Max,Min;
20     while(scanf("%d%d",&a,&b),a!=-1&&b!=-1)
21     {
22         flag=true;
23         if(a==0&&b==0)
24         {
25             printf("Yes\n");
26             continue;
27         }
28         for(int i=1; i<100005; i++)
29         {
30             set[i]=i;
31             vis[i]=false;
32         }
33         while(a||b)
34         {
35             vis[a]=true,vis[b]=true;
36             int x=find(a);
37             int y=find(b);
38             if(x!=y)
39                 set[x]=y;
40             else
41                 flag=false;
42             scanf("%d%d",&a,&b);
43         }
44         int ans=0;
45         for(int i=1; i<100005; i++)
46         {
47             if(vis[i] && set[i]==i)
48                 ans++;  //题目有可能不止一个集合
49             if(ans>1)
50                 flag=false;
51         }
52         if(flag)
53             printf("Yes\n");
54         else
55             printf("No\n");
56     }
57     return 0;
58 }
View Code

 

推荐阅读