这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握。

下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正。

1.题目概览

这道题是杭电1272,POJ 1308如果写好了代码可以试一试。

小希的迷宫

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

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

YesYesNo

2.题目理解

题目的意思应该不难理解,就是给你很多成对的数,代表有关系的房间的编号,其实就是一棵树的抽象,你可以把这个想成一颗树。

然后,你想一下,形成树的条件。

1.有一个根(root),并且这个根没有入度(没有老爸)。

2.不能形成环。

3.N个结点(node)形成一棵树,有n-1条边。

然后与题目一相比,不就是要你判断给的一组测试数据是不是一棵树。(有坑点,这棵树的结点连通是双向的)

3.分析目标

1.输入输出实现

这题的输入有那么一点特殊,首先题目是以两个-1结束。并且每组测试数据是以两个0结束。

输出很简单,能则输出Yes,否则输出No。

2.实现代码

int a, b;  // 定义接收数据变量

while (~scanf("%d%d", &a, &b) &&!(a<0&&b<0))

{

int flag=1;

if (a==b)

{

if (a) flag=0;   //这是一个坑点,我被坑了好多次。0 0是树,而相同的如1 1不是树

}

else

{

int k=1, max=0;

while (a||b) //循环输入数据 并保存到 mark数组里

{

mark[k][0]=a;

mark[k++][1]=b;

if (max<a) max=a;

if (max<b) max=b;

scanf("%d%d", &a, &b);

}

_make(max);         //  初始化函数 , 使每个节点都指向它自己

for (int i=1; i<k; i++)

if (_union(mark[i][0],mark[i][1])) //合并函数, 使两个节点合并

{

flag=0;

break;

}

if (flag)  //  下面的是  check看是不是一颗树 不然就成深林了

{

int forefather=_find(mark[1][0]);

for (int i=1; i<k; i++)

if (_find(mark[i][0])!=forefather||_find(mark[i][1])!=forefather)

{

flag=0;

break ;

}

}

}

printf("%s\n", flag?"Yes":"No"); //样例输出

3.函数介绍

void _make(int max) 这个函数是初始化函数,目的是让每一个节点都指向他自己。这个函数有一个形参max他其实是一个小优化。一般情况都是从1初始化到100000,时间复杂度是O(n),但是你其实只需要初始化到最大的输入数据就行了,后面的是没必要的。

int _find(int x)这个函数是查找函数,目的是找到祖先。本来这个函数可以压缩路径的。但是我在抗电上测试了一下,压缩路径过后反而时间变多了,适得其反所以还是不压缩路径了。对了此函数的返回值是祖先。如果自己不是自己的祖先的话,此函数会一直递归下去,所以有时候要考虑会不会爆栈。

int _union(int a, int b) 这个函数是合并函数,目的是把两个节点链接起来。 有两个形参,相信读者一看就知道这两个形参的意义了吧。这个函数是最主要的,用它来调用_find()函数,完成合并工作,同时判断有没有环的形成。

4.最后就是这题的坑点分析了

此题的坑点说不多也多,不小心就掉坑里了。

1.就是那个0 0, 1 1之类的特叛,姿势不对就可能,掉进这个坑里。

2.爆栈,这个是不注意,代码写挫了就会爆栈。对了别压缩路径。

3.判断有没有环的形成。

4.判断有没有形成深林。

我就找到这么多了。。。

4.全部代码

#include <stdio.h>

#define MAX 100001

int father[MAX], mark[MAX][2];

void _make(int max)

{

for (int i=1; i<=max; i++)

father[i]=i;

return ;

}

int _find(int x)

{

if (x!=father[x])

x=_find(father[x]);

return x;

}

int _union(int a, int b)

{

a=_find(a);

b=_find(b);

if (a==b) return 1;

father[a]=b;

return 0;

}

int main()

{

int a, b;  // 定义接收数据变量

while (~scanf("%d%d", &a, &b) &&!(a<0&&b<0))

{

int flag=1;

if (a==b)

{

if (a) flag=0;   //这是一个坑点,我被坑了好多次。0 0是树,而相同的如1 1不是树

}

else

{

int k=1, max=0;

while (a||b) //循环输入数据 并保存到 mark数组里

{

mark[k][0]=a;

mark[k++][1]=b;

if (max<a) max=a;

if (max<b) max=b;

scanf("%d%d", &a, &b);

}

_make(max);        //  初始化函数 , 使每个节点都指向它自己

for (int i=1; i<k; i++)

if (_union(mark[i][0],mark[i][1])) //合并函数, 使两个节点合并

{

flag=0;

break;

}

if (flag)  //  下面的是  check看是不是一颗树 不然就成深林了

{

int forefather=_find(mark[1][0]);

for (int i=1; i<k; i++)

if (_find(mark[i][0])!=forefather||_find(mark[i][1])!=forefather)

{

flag=0;

break ;

}

}

}

printf("%s\n", flag?"Yes":"No"); //样例输出

}

return 0;

}

最后给大家留了个链接 ,是我做的word, 谢谢!

我会留在我博客里的,有兴趣的可以关注一下。

杭电 1272 POJ 1308 小希的迷宫的更多相关文章

  1. hdu1272 小希的迷宫(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目: 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...

  2. POJ 1308&&HDU 1272 并查集判断图

      HDU 1272 I - 小希的迷宫 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  3. hdu 1272 小希的迷宫 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...

  4. HDU 1272小希的迷宫(裸并查集,要判断是否构成环,是否是连通图)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    ...

  5. hdu 1272 小希的迷宫(java实现)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. hdu 1272 小希的迷宫(并查集+最小生成树+队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)     ...

  7. HDU 1272 小希的迷宫 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. hdu 1272 小希的迷宫

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

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

    小希的迷宫 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/L Description 我们的小伙伴Bingo身为大二学长,他乐于 ...

随机推荐

  1. 驳Linux不娱乐 堪比Win平台中十款播放器

    播放器在我们日常生活中扮演着非常重要的角色,在Windows操作系统中,播放器被应用的非常广泛,不但我们可以听音乐,甚至还可以听广播,制作铃声,下载音乐等等.而在Linux发行版中,缺少娱乐性一直性W ...

  2. 2014第11周一word样式

    今天摸索使用了word的样式替换功能感觉不错,简单记录下: 1.将某一个样式的标题统一替换为另一样式,之前一般是格式化一个个找到标题设置格式, 今天才发现可以选中标题->在浮动框上单击样式或开始 ...

  3. egret随笔-publish命令的改进

    缘由 导了几天的ipa,每次publish后都要改zip包名的代码,终于鼓起勇气翻看了一下egret publish的代码,唉,这代码...应该不会是北京的那几个大牛写的吧??? 正题 看了源码才知道 ...

  4. chrome可以登陆账号的hosts文件

    原文地址: 百度 chrome吧 http://zhidao.baidu.com/question/1818688600091435508.html?qq-pf-to=pcqq.group http: ...

  5. Android提高第十一篇之模拟信号示波器

    上次简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器(PS:以前也讲过J2ME版的手机示波器).最近物联网炒 ...

  6. Android 根据EditText搜索框ListView动态显示数据

    根据EditText搜索框ListView动态显示数据是根据需求来的,觉得这之中涉及的东西可能比较的有意思,所以动手来写一写,希望对大家有点帮助. 首先,我们来分析下整个过程: 1.建立一个layou ...

  7. 8种排序算法的C#实现

    排序是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列.排序根据涉及的存储器的不同分为内部排序和外部排序:内部排序是指待排序记录存放在内存进行的排序过程:外部排序是指待排序记录的数 ...

  8. OCP准备记录

    0628: 051 OK053 1-192! 加油了,每天至少100道吧明天复习一下626,627,628这几天的成果先看一遍对的,再看一遍错的!!最少要把051复习一遍 0629: 今天忙了太久 只 ...

  9. notepad++中的zencoding的快捷键修改[转]

    在notepad++自己的”设置-->管理快捷键“中,找不到zen coding的快捷键,我又不想改掉已经用习惯了的ctrl+/,结果就用了一种比较偏门的修改快捷键的解决方案,希望可以帮到有同样 ...

  10. 开发环境配置--Ubuntu+Qt4+OpenCV(一)

    同系列的文章 1. 开发环境配置--Ubuntu+Qt4+OpenCV(一) 2. 开发环境配置--Ubuntu+Qt4+OpenCV(二) 3. 开发环境配置--Ubuntu+Qt4+OpenCV( ...