小希的迷宫 HDU - 1272 (并查集)
思路: 当图中的集合(连通子图)个数为1并且边数等于顶点数-1(即改图恰好为一棵生成树)时,输出Yes.
此题的坑:(1) 如果只输入0 0算作一组数据的话答案应该输出Yes
(2) 输入数据可能并不是连通图,有可能一开始不连通,所以最后一定要判断其连通子图个数是不是1
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cmath> 5 #include<set> 6 #include<algorithm> 7 #include<cstdio> 8 #include<map> 9 #include<cstring> 10 11 using namespace std; 12 13 int Tree[100100]; 14 15 int findRoot(int x) 16 { 17 if(Tree[x] == -1) 18 return x; 19 int tmp = findRoot(Tree[x]); 20 Tree[x] = tmp; 21 return tmp; 22 } 23 24 int main() 25 { 26 int a, b; 27 set<int> Set; // 使用Set保存图中的所有顶点编号 28 for(int i = 0; i <= 100000; ++i) 29 Tree[i] = -1; 30 31 int rimCnt = 0; 32 while(cin >> a >> b) 33 { 34 if(a == -1 && b == -1) 35 break; 36 37 if(a == 0 && b == 0) 38 { 39 if(rimCnt == 0) // 只有输入一组数据0 0的时候,应该输出Yes 40 { 41 cout << "Yes" << endl; 42 continue; 43 } 44 int Vcnt = Set.size(); // 顶点计数 45 int Scnt = 0; // 图中的连通子图(集合)个数 46 for(set<int>::iterator iter = Set.begin(); iter != Set.end(); ++iter) 47 { 48 if(Tree[*iter] == -1) 49 { 50 Scnt++; 51 } 52 } 53 54 // 当图中的集合只有一个并且总边数等于顶点数-1的时候,输出Yes 55 if(Scnt == 1 && rimCnt == Vcnt - 1) 56 { 57 cout << "Yes" << endl; 58 } 59 else 60 { 61 cout << "No" << endl; 62 } 63 64 for(int i = 0; i <= 100000; ++i) 65 Tree[i] = -1; 66 Set.clear(); // 清空集合 67 rimCnt = 0; // 边数置零 68 continue; 69 } 70 else 71 { 72 rimCnt++; // 边计数 73 Set.insert(a); 74 Set.insert(b); 75 int ra = findRoot(a); 76 int rb = findRoot(b); 77 if(ra != rb) 78 { 79 Tree[ra] = rb; 80 } 81 } 82 83 } 84 85 return 0; 86 }
转载于:https://www.cnblogs.com/FengZeng666/p/11398225.html
小希的迷宫 HDU - 1272 (并查集)相关推荐
- 小希的迷宫 HDU - 1272---并查集+思维
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- hdu 5606(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606 解题思路: 这题实际上是要找一些连通的节点,使得边上的权值都为0. 很明显,首先把权值为0的边都 ...
- HDU 5441并查集 by cyl
HDU 5441 题意: 杰克喜欢旅游,从城市a到城市b是他最喜欢的,现在有n个城市m个路. 当杰克在从城市a到城市b 的时候需要坐车,但是需要有等待时间t,他无法忍受超过x 的等待时间. ...
- hdu 1232 并查集
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...
- hdu 4907(并查集)
Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- hdu 2473(并查集+删除操作)
解题思路:这道题有并查集的删除操作,如果直接对这一棵树进行删除节点操作肯定是很困难的.所以可以建立虚拟节点,只要有一个节点要被删除,就直接把它投影到虚拟节点上,即用这个虚拟节点来代替我们要删除的节点. ...
- hdu 3172(并查集+hash)
解题思路:典型的并查集,只是每个人的名字要转换成数字,可以用map,也可以用字典树,我最开始用的字典树结果爆内存了.. 爆内存: #include<iostream> #include&l ...
- hdu 3081(并查集+最大流)
题目大意: n个男孩n个女孩,女孩选男孩,每个女孩都要选到不同的人 k对女孩有相同选择标准, 女孩每轮都选择没选过的男孩, 问总共能选几轮.解题思路:女孩编号1......n,男孩编号n+1,n+2, ...
- 迷宫收集星星 并查集解答
群里发的来历不明的题目 可使用深搜广搜解决 我试了试并查集 效率不是很高 题目描述 解答 并查集 1 #include <iostream> 2 #include <vector&g ...
最新文章
- Apache POI:解决数据库和Excel之间相互转换的烦恼~
- RHEL5.3下搭建SSH
- kali安装python3.7_Debian服务器之安装Python3.7
- C#LeetCode刷题之#933-最近的请求次数(Number of Recent Calls)
- springcloud使用feign进行远程服务调用
- Python菜鸟入门:day04数字与字符串
- 浙江利捷分析报告(0607)
- c语言程序设计新教材,《C语言程序设计》教学大纲(新)教材.doc
- 【SAP】实施方法论-ASAP
- JavaWeb开发——注册登录的表单验证
- Mac访问Github加速
- FreeMarker下拉列表选中值回显
- wpa_supplicant 使用
- 第三方app实现微信登录功能
- CF 815C 树形背包
- 茅台抢购脚本golang版本使用教程
- 用uniapp开发打包多端应用完整指南
- 什么叫DMZ区?DMZ区有什么作用?应该怎样构建DMZ?
- ALPEN阿尔卑斯山时间管理法
- 【数学分析】一致连续的一些证明方法