小希的迷宫

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

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. 满足边数加一等于顶点数的规律(不考虑重边和指向自身的边)
判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。
边数和顶点数的话,在union的时候边数加一,顶点数在读入的时候统计,最后判断即可,代码写的很挫,因为后面看别人得博客才知道,输入会只有0 0这样的数据,这也是合理的输入,要输出Yes
转载:http://blog.csdn.net/wdkirchhoff/article/details/41760741#plain
//以上为转载内容
#include<stdio.h>
#include<set>
using namespace std;
set<int>S;
int main()
{
freopen ("a.txt" , "r" , stdin ) ;
int a,b;
while(scanf("%d%d",&a,&b)&&(a!=-||b!=-))
{
if(a==&&b==) printf("Yes\n");
int num=;
S.insert(a);
S.insert(b);
while(scanf("%d%d",&a,&b)&&(a||b))
{
S.insert(a);
S.insert(b);
num++;
}
printf ("\n") ;
if(S.size()-==num) printf("Yes\n");//满足边数加一等于顶点数的规律(不考虑重边和指向自身的边)
else printf("No\n");
S.clear();
}
return ;
}

((个人观点:其实只要满足 edges + 1 == points , 就能判断出:

1.只有一棵树;

2.且没有回路;

如果在已知只有一棵树是 , 那么用 kruskal 算法也能快速判断出是否有回路))

以上收回=。= ,bccn上的大神给了我饭粒 , 所以还是看转载的那部分吧(正解):

1 2
3 4
3 5
4 5
0 0

所以上面那个能够应该是数据不够强造成的吧:(加上kruskal算法即可)

 #include<stdio.h>
#include<set>
#include<iostream>
using namespace std;
set<int>S ;
int a , b , m ;
struct edge
{
int u , v ;
}e[]; int f[] ; int find(int x )
{
return f[x] == x ? x : find (f[x]) ;
} void init ()
{
for (int i = ; i <= ; i++)
f[i] = i ;
} void kruskal ()
{
init () ;
int x , y ;
for (int i = ; i <= m ; i++) {
x = find(e[i].u) ;
y = find(e[i].v) ;
if ( x == y) {
puts ("No") ;
return ;
}
else {
f[x] = y ;
}
}
puts("Yes") ;
} int main ()
{
// freopen ("a.txt" , "r" , stdin ) ;
while ( ~ scanf ("%d%d" , &a , &b)) {
if (a == - && b == -)
break ;
if (a == && b == ) {
puts ("Yes") ;
continue ;
} m = ;
S.insert (a) ;e[m].u = a ;
S.insert (b) ;e[m].v = b ;
while ( scanf ("%d%d" , &a , &b) && a || b) {
m++ ;
S.insert (a) ; e[m].u = a ;
S.insert (b) ; e[m].v = b ;
}
// cout << m << endl ;
if ( S.size () != m + )
puts ("No") ;
else
kruskal () ;
S.clear ();
}
return ;
}
/*
1 2 3 4 3 5 4 5 0 0 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 2 3 4 0 0 -1 -1
*/

小希的迷宫(MST单棵树判断法则)的更多相关文章

  1. HDU - 1272 小希的迷宫 并查集判断无向环及连通问题 树的性质

    小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...

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

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

  3. SDUT 2129 树结构练习——判断给定森林中有多少棵树

    树结构练习——判断给定森林中有多少棵树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description  众 ...

  4. 小希的迷宫(HDU 1272 并查集判断生成树)

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

  5. [剑指Offer]判断一棵树为平衡二叉树(递归)

    题目链接 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=0&tqId=0&rp=2&a ...

  6. 判断一棵树是否为二叉搜索树(二叉排序树) python

    输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的 ...

  7. [LeetCode]Subtree of Another Tree判断一棵树是不是另一棵树的子树

    将树序列化为字符串,空节点用符号表示,这样可以唯一的表示一棵树. 用list记录所有子树的序列化,和目标树比较. List<String> list = new ArrayList< ...

  8. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  9. hdoj 1272 小希的迷宫

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...

随机推荐

  1. Linq之延迟加载特性

    目录 写在前面 系列文章 延迟加载 总结 写在前面 上篇文章介绍了linq中常见的几个关键字,并列举了几个例子,算是对linq如何使用有了初步了解.上篇文章中也提到了,能够使用linq的场合有一个要求 ...

  2. Bootstrap3.0学习第二十五轮(JavaScript插件——折叠)

    详情请查看http://aehyok.com/Blog/Detail/31.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  3. 传说中的WeixinJSBridge和微信rest接口

    直接上图,金山的APP“微信导航”,从界面上看有粉丝数等关键数据,实现了直接关注功能,莫不是rest接口?这江湖是大佬们的江湖,小喽啰只有眼馋的份咯. 很早就听说过WeixinJSBridge,不过官 ...

  4. WebView加载本地html、js文件常见问题及解决办法

    声明:基于android studio平台,php语言搭建服务器 目录: 一.JavaScript脚本语言没有反应 二.alert无法弹出 三.html页面之间不能跳转 四.屏幕缩放没有达到预期效果 ...

  5. OVER(PARTITION BY)函数介绍

    问题场景 最近在项目中遇到了对每一个类型进行求和并且求该类型所占的比例,当时考虑求出每种类型的和,并在java中分别对每一种类型的和与总和相除求出所占比例.后来,想到这样有点麻烦,并且项目中持久层使用 ...

  6. html 中添加背景音乐

    Embed (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等, Netscape及新版的IE 都支持.u ...

  7. zabbix 客户端的安装

    这里我们在客户端安装就是用rpm的安装方式了: 在我使用RPM安装的时候遇到了一个错误 [root@git src]# rpm -ivh http://repo.zabbix.com/zabbix/3 ...

  8. Mysql-日期转换

    一.字符串转日期 下面将讲述如何在MYSQL中把一个字符串转换成日期: 背景:rq字段信息为:20100901 1.无需转换的: SELECT * FROM tairlist_day WHERE rq ...

  9. Java基础-final和static的区别

    很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...

  10. selenium常见的疑问和问题

    .确认(verifation)和断言(assert)有什么区别?  确认:当测试中的一个用例存在错误时,系统将会继续运行这些测试  断言:当测试中的一个用例存在错误时,系统将会退出当前用例  总而言之 ...