HDU 1272 简单并查集

小希的迷宫

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24915    Accepted Submission(s): 7641

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   62   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、无环

当 输入 0 0时也输出yes。

代码很容易就写出了:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <vector>
 6 #include <map>
 7 #include <queue>
 8 #include <set>
 9 #include <vector>
10 #include <string>
11 #include <sstream>
12 using namespace std;
13
14 int father[100005];
15 int a[100005];
16 int MAXH, MINH;
17
18 int findroot(int p)
19 {
20     int r, x, j;
21     r=p;
22     while(r!=father[r])
23     r=father[r];
24     x=p;
25     while(x!=r)
26     {
27         j=father[x];
28         father[x]=r;
29         x=j;
30     }
31     return r;
32 }
33
34 main()
35 {
36     int x, y, i, j, k, num, flag=1;
37     for(i=1;i<=100005;i++) father[i]=i;
38     num=0;
39     set<int>se;
40     while(scanf("%d %d",&x,&y)==2&&x!=-1)
41     {
42         if(x==0&&y==0)
43         {
44             if(!flag)
45             {
46                 printf("No\n");
47                 for(i=1;i<=100005;i++) father[i]=i;
48                 se.clear();
49                 flag=1;continue;
50             }
51             set<int>::iterator it;
52             for(it=se.begin();it!=se.end();it++)
53             if((*it)==findroot(*it))
54             num++;
55             se.clear();
56             if(num>1) {
57                 printf("No\n");
58             }
59             else printf("Yes\n");
60             num=0;
61             for(i=1;i<=100005;i++) father[i]=i;
62             continue;
63         }
64         int fx=findroot(x);
65         int fy=findroot(y);
66         se.insert(x);
67         se.insert(y);
68         if(fx!=fy)
69         {
70             if(fx>fy) swap(fx,fy);
71             father[fy]=fx;
72         }
73         else flag=0;
74     }
75 }

HDU 1272 简单并查集

时间: 2024-10-05 04:43:35

HDU 1272 简单并查集的相关文章

小希的迷宫 HDU 1272(并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1272 分析:和Poj1308一模一样啊(实质上都是判断是不是一棵树),就除了最后的结论的写法不一样.照搬那题的代码一次AC... 判断树: 1.空树也是树 2.森林不符合题意,只能是一棵树        #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include&

HDU 1875 简单并查集

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15734    Accepted Submission(s): 4872 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题

POJ 2492 (简单并查集) A Bug&#39;s Life

题意:有编号为1~n的虫子,开始假设这种昆虫是异性恋.然后已知xi 和 yi进行交配,根据已知情况分析能否推理出其中是否有同性恋 这道题和 POJ 1182 食物链 十分相似,不过在更新与父节点关系的时候要简单一些 sex数组保存的是与父节点的性别关系,如果与父节点是同性,则为0,否则是1 每次路径压缩的同时要更新sex[a] = (sex[a] + sex[temp]) % 2; 还有就是如果x 和 y 不在一个集合,两棵树进行合并的时候,考虑x px y py 四者之间的关系,有 paren

Hdu 2473(并查集删除操作) Junk-Mail Filter

有木有很吊 加强 加强版   啊  ,看了都不敢做了   ,后来先做了食物链这个我还是看过的,但还是A不掉,没明白神魔意思 ,总而言之,大牛的博客是个好东西,我就那么看了一下,还是不懂怎莫办啊,哎,就那样就A掉了....... 今天我们来谈一下这个并查集的删除操作,根据我对大牛的理解啊,这个并查集的删除操作并不是把原来的节点删除掉,而是用一个替身替掉,现在的这个点只是用作桥梁的作用,即是无用的,del  ,,,del  ,,,,删除,那些被删掉的就从n开始给他们一个地址,然后即如下代码所示 #i

【简单并查集】Farm Irrigation

Farm Irrigation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 6   Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Benny has a spacious fa

HDU 4496 D-City(并查集,逆思维)

题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... #include<stdio.h> #include<string.h> int fx,fy,r,bin[10010]; int x[100010],y[100010],n,m,i,count,ans[100010],j; int find(int x) { //改成这样就不会超时了么好

poj1611 简单并查集

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 32781   Accepted: 15902 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. T

POJ 2524 Ubiquitous Religions (简单并查集,三种方式)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 30791   Accepted: 14928 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

poj2524(简单并查集)

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>using namespace std;int n,m;int bin[50001];int findx(int x){    int r=x;    while(r!=bin[r])        r=bin[r];    int j=x,k;    while(j!=r)    {        k=bin