Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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
 
 
 
数据结构基础题:运用并查集来检查两个点之间是否有两条以上的路,这里特别要注意的是有可能”存在两个集合“,因此我是最后用一个vis[],和ans以及判断是否father[i]==i
来计算集合的个数(ans).
 
 #include<cstdio>
#include<string.h>
using namespace std;
//int rank[100010];
int father[];
int max1=;
int vis[];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
bool Union(int x,int y)
{
int x1=find(x),y1=find(y);
if(x1!=y1)
{
father[y1]=x1;
return true;
//rank[x]+=rank[y];
//if(max1<rank[x]) max1=rank[x];
//return;
}
return false;
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF&&a!=-&&b!=-)
{
for(int i=;i<=;i++)
father[i]=i;
if(a==&&b==){printf("Yes\n");continue;} //注意continue!!!
int min=;
int max=;
int flag=;
memset(vis,,sizeof(vis));
while(a||b)
{
if(a>max) max=a;
if(b>max) max=b;
if(a<min) min=a;
if(b<min) min=b;
vis[a]=;
vis[b]=;
if(!Union(a,b)) flag=;
scanf("%d %d",&a,&b);
}
if(flag==) printf("No\n");
else{
int ans=;
for(int i=min;i<=max;i++)
if(vis[i]&&father[i]==i)
ans++;
if(ans==) printf("Yes\n");
else printf("No\n");
} }
return ;
}

换了一个小思路

 #include<cstdio>
#include<string.h>
using namespace std;
//int rank[100010];
int father[];
int rank[];
int max1=;
//int vis[100010];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
bool Union(int x,int y)
{
int x1=find(x),y1=find(y);
if(x1!=y1)
{
father[y1]=x1; rank[x1]+=rank[y1];//记录深度
if(max1<rank[x1]) max1=rank[x1];
return true;
//rank[x]+=rank[y];
//if(max1<rank[x]) max1=rank[x];
//return;
}
return false;
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF&&a!=-&&b!=-)
{
for(int i=;i<=;i++)
{
father[i]=i;rank[i]=;
} if(a==&&b==){printf("Yes\n");continue;}
int flag=;
//memset(vis,0,sizeof(vis));
int ans=;
while(a||b)
{
ans=ans+;//这是记录输入的边的条数
if(!Union(a,b)) flag=;
scanf("%d %d",&a,&b);
}
// printf("%d %d\n",ans,max1);
if(flag==) printf("No\n");
else if(max1-==ans) printf("Yes\n");
else printf("No\n");
}
return ;
}

G - 小希的迷宫的更多相关文章

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

    1今天准备复习三道以前做过的题呢,结果只看了一道,也因为交题的时候没把测试时候为了方便而改的数字改过来而wrong answer,浪费了好长时间,啊啊啊~~ 不过这道题应该是掌握了,嘿嘿…… Desc ...

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

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

  3. hdu 1272 小希的迷宫

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

  4. 小希的迷宫(MST单棵树判断法则)

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

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

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

  6. hdu 1257 小希的迷宫 并查集

    小希的迷宫 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 D ...

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

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

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

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

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

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

随机推荐

  1. 从HTML到HTML

    从HTML到HTML 当你在使用一些模板软件,如Thymeleaf的时候,了解web的标准,HTML家族的内部是十分重要的,至少如果你想知道自己在做什么的时候. 问题是,每个人都知道他们正在使用一些技 ...

  2. Leetcode 详解(ReverseWords)

    Leetcode里面关于字符串的一些问题,描述如下: Given an input string, reverse the string word by word. For example,Given ...

  3. centos 6安装epel

    1.通过:https://mirrors.ustc.edu.cn/找到epel rpm包链接,这里的是 https://mirrors.ustc.edu.cn/epel/epel-release-la ...

  4. (转)在oracle中varchar和varchar2有什么区别?

    1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节: 2.VARCHAR2把空串等同于null处理,而varchar仍 ...

  5. AWS-CDH5.5安装-安装

    1.安装MySQL [root@ip---- mysql]# rpm -ivh MySQL-server--.el6.x86_64.rpm MySQL-client--.el6.x86_64.rpm ...

  6. 6、Concurrent-Mark-Sweep

    1.cms 主要用于年老代垃圾回收 2.这玩意牺牲通吐量换取最短垃圾回收时间 3.有的地方说是四个阶段,有的地方说五个阶段,还有六个阶段的,真相是----我也不知道 四个阶段: Initial mar ...

  7. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(04)

    1.3.3 框架窗口对象 MFC的CWnd类及其派生类为窗口或应用程序创建的窗口提供了面向对象的接口. CMainWindow是从CFrameWnd类派生而来,CFrameWnd模仿框架窗口的行为,可 ...

  8. google closure--继承模块一:goog.inherits()

    最近在项目是使用了google closure框架,深入研究了一下源码,先从最简单的继承系统吧. 废话不多说,closure继承模块主要有2个API: goog.inherits(childCtor, ...

  9. JSON介绍

    JSONhttp://www.json.org/json-zh.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机 ...

  10. shell 随机从数组中抽取三个随机数(#可持续不停抽取)

    #!/bin/bash #b= ]] #do #sleep 1 student=( DPL YPD LT ZZM HY CQW LSJ ybr) a=$[RANDOM%+] c=$[RANDOM%+] ...