题目描述

上次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

题解:首先判断输入的俩个数,如果俩个数的根节点是一个的话,就说明存在环,否则,我们就合并,然后在判断一下是否为连通图,即:所有的点是否都在一个根节点上。

代码如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int f[100005];
bool vis[100005];  //记录点是否出现过
int Find(int x)
{if(x != f[x])f[x] = Find(f[x]);return f[x];
}
void join(int x, int y)
{x = Find(x);y = Find(y);if(x != y)f[x] = y;
}
int main()
{int x, y;while(scanf("%d%d", &x, &y) != EOF && (x != -1 && y != -1)){if(x == 0 && y == 0){  //如果输入的全为0则直接输出YEScout << "Yes" << endl;continue;}memset(vis, false, sizeof vis);         for(int i = 1; i <= 100000; i++)f[i] = i;vis[x] = true;vis[y] = true;join(x, y);int flag = 0;while(cin >> x >> y && (x != 0 && y != 0)){vis[x] = true;vis[y] = true;if(Find(x) == Find(y))flag = 1; else join(x, y);}if(flag)cout << "No" << endl;else {int ans = 0;for(int i = 1; i <= 100000; i++){if(vis[i] && f[i] == i)ans++;}if(ans == 1)cout << "Yes" << endl;  //如果有多个根节点,说明不是一连通图else cout << "No" << endl;}}return 0;
}

B - 小希的迷宫 (并查集判断是否存在环)相关推荐

  1. HDOJ---1272 小希的迷宫[并查集]

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

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

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

  3. 并查集判断是否有环存在

    题目描述 思路分析 代码实现 package com.atguigu.disjointSet;public class djset {public static int VERTICES=6;publ ...

  4. 并查集(树与环小希的迷宫)

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

  5. hdu1272——使用并查集判断是否形成环状

    先上题目链接HDU1272 通读题目,再比较下面给出的三张图,我们可以发现前面两张输出YES的图里面没有回路,第三张图里面有回路,结合题目,我们可以发现这道题目考察的是"运用并查集判断图中是 ...

  6. java并查集判断是否是连通图_判断 连通图 (图论_并查集)

    给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的. 输入:每组数据的第一行是两个整数n 和m(0< n <=1000).n 表示图的顶点 数目,m 表示图中边的数目.如果n ...

  7. ccsu1359 木棒相交 (叉积线段判交,并查集判断是否属于同一个集合)

    题意:判断n条木棒中木棒a是否与木棒b相交.其中木棒的相交具有传递性. 首先用一个判断线段是否相交的函数判断相交: struct Point {double x;double y; }; typede ...

  8. 图论 —— 图的连通性 —— 并查集判断连通性

    当需要判断图是否为连通图时,可以使用并查集来进行连通分量的统计,若连通分量大于 1,则说明图中存在多个连通分量,图不为连通图. int n,m; int father[N]; int Find(int ...

  9. 利用并查集判断一个无向图是否成树

    hdu 1272 利用并查集方法,找到各点的根节点. 几点注意: 一.树:1.无环 2.根节点入度为0,其余入度为1 判断依据: 1.若两个点的根节点相同(这两个点是父子关系),则形成环. 2.若所有 ...

最新文章

  1. 1500+ FPS!目前最快的CNN人脸检测算法开源
  2. 用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)
  3. 迁移.NET 1.0 应用到FX 2.0 –.NET评测网的工具箱
  4. LeetCode 644. 最大平均子段和 II(二分查找)*
  5. 北大保安又双叒…出“传奇”!这次是挑战“天下第一考”
  6. python是轻量级语言吗_python socket 轻量级服务器详解
  7. 如何恢复任务栏中的显示桌面图标?
  8. Java实现端口扫描器
  9. 百度移动开放平台认领应用--apk 空包签名
  10. MySQL调优(二)——索引最佳实践
  11. 区块链在保险业的应用
  12. 淘客订单检测接口--检测淘宝订单是否是淘客订单的接口
  13. python中pass与break区别
  14. 1674386-82-3,Lipoamido-PEG2-alcohol醇基可以反应进一步衍生化合物
  15. 核芯国产电压基准源芯片SOT23-6,SOT23-3,SOIC-8
  16. 安卓手机Recovery概述和原理分析
  17. 今日头条校招2016-09-28在线编程题(2题)
  18. C++机器学习库整理
  19. POJ 3264 Balanced Lineup
  20. 内存存放方式_如何以正确的方式存放剩余涂料

热门文章

  1. RS232和RS485区别
  2. 【嵌入式】使用Cross Toolchain构建交叉工具链
  3. 使用 Win 7 必须知道的快捷键
  4. 代码测试:简单用户注册信息验证
  5. JDK8下载,安装及环境变量的配置
  6. [原]部署kubernetes dashboard(二)
  7. angular2+typescript在asp.net MVC Web项目上的实现
  8. laravel 环境自编译过程
  9. CQOI 2016 不同的最小割
  10. ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图