题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5222
题意:有一个探险家,探险一个地方,这个地方有n个洞穴,有若干条边,有的边是有向边,有的是无向边,每条边在走过后就坍塌,问你这个探险家能不能选择一个点,然后经过最少一个点,然后回到原点
解析:对于所有的无向边做并查集,如果对于两个点,在未合并前就已经是一个集合了,那么就存在环,即有解,若果此时没有判断出环的话,那么仅仅只靠无向边是找不到的,那么可以把合并后的点生成的一个新的图,于是就相当于判断这个新生成的无向图是否存在环,此时用拓扑排序判断即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
vector<int>G[maxn];
int in[maxn],fa[maxn];
void init(int n)
{for(int i=0;i<=n;i++){in[i] = 0,fa[i] = i;G[i].clear();}
}
int getfa(int x)
{if(x==fa[x])return x;return fa[x] = getfa(fa[x]);
}
bool judge(int n)
{int cnt = 0;queue<int>q;for(int i=1;i<=n;i++){if(in[i]==0)q.push(i);}while(!q.empty()){int u = q.front();q.pop();cnt++;for(int i=0;i<(int)G[u].size();i++){int v = G[u][i];in[v]--;if(in[v]==0)q.push(v);}}return cnt!=n;
}
int main(void)
{int t,n,m1,m2;scanf("%d",&t);while(t--){scanf("%d %d %d",&n,&m1,&m2);int x,y,t1,t2,flag = 0;init(n);for(int i=0;i<m1;i++){scanf("%d %d",&x,&y);t1 = getfa(x);t2 = getfa(y);if(t1==t2)flag = 1;elsefa[t1] = t2;}for(int i=0;i<m2;i++){scanf("%d %d",&x,&y);t1 = getfa(x);t2 = getfa(y);if(t1==t2)flag = 1;else if(!flag){G[t1].push_back(t2);in[t2]++;}}if(flag || judge(n))puts("YES");elseputs("NO");}return 0;
}

hdu5222 Exploration【并查集+拓扑排序】相关推荐

  1. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...

  2. Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解

    题目  Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...

  3. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    1 /* 2 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B ...

  4. HDU——1272小希的迷宫(并查集+拓扑排序)

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

  5. 家谱树 (并查集拓扑排序)

    目录 拓扑排序 Kahn. 最后附上Kahn的代码: 链式前向星做法: 其次是我用Kahn做的家谱树的代码(矩阵): 其次是我用Kahn做的家谱树的代码(链式前向星): [题目描述] 有个人的家族很大 ...

  6. HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

    link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...

  7. 并查集+字符排序-困兽之斗(乐视题)

    士兵对小贱君说:"看到漂浮在你身边的宝石了吗?彩虹连接的两颗宝石可以任意交换位置,你需要通过一系列交换后使得宝石组成的字符串的字典序最小.若不能破阵,那还是请回吧!" 小贱君观察了 ...

  8. 【LeetCode每日一题:1697. 检查边长度限制的路径是否存在~~~并查集+数组排序+排序记录下标位置】

    题目描述 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边.请注意,两 ...

  9. 并查集 rank排序+路径压缩

    有两个优化点: rank排序 记录两个合并的根的rank rank低的合并到rank高的上 这个优化目的是避免树的深度增加 路径压缩 parent[p] = parent[parent[p]] 这行代 ...

最新文章

  1. Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
  2. bzoj4448 [Scoi2015]情报传递
  3. 2015 UESTC Winter Training #6【Regionals 2010 North America - Rocky Mountain】
  4. 什么是补码-网上找到的,非原创
  5. 如何linux网页修改回80端口,linux下如何修改iptables开启80端口
  6. 学习Java,真的可以月薪过万嘛?真实个人经历告诉你,记录了平时学习的内容以及学习过程中最真实的感受(三)
  7. UI自动化 win32 模拟键盘按键
  8. leetcode739
  9. 金蝶计算机会计实验报告总结,金蝶财务软件实训总结.doc
  10. 高性能台式计算机一体机,一体机电脑与台式机电脑,究竟选哪个好?
  11. 中国大学MOOC公开信息收集
  12. 浏览器断网事件offline和联网事件online
  13. python使用RSA加密算法
  14. AFEPack 使用 Tutorial(三):解三维泊松方程
  15. warpAffine函数解析
  16. _getch()函数的一些使用方法
  17. 计算机毕业设计(51)java小程序毕设作品之教室图书馆座位预约小程序系统
  18. CPU 64位和32位
  19. PatchMatchNet实践(环境配置、相关软件安装)及理论学习笔记(更新中)
  20. MAC电脑存储空间占用过高怎么办?

热门文章

  1. 不一样的视角:从JVM内存模型谈线程安全
  2. 用html语言设计一个创意图案,10个独特的+创新的网站设计布局创意
  3. java计算机毕业设计vue健身食谱系统MyBatis+系统+LW文档+源码+调试部署
  4. 原生js把html字符串转dom,js字符串转DOM,DOM转字符串伪代码
  5. cin,cin.get(),cin.getline(),getline(),fget()
  6. matlab获取矩阵的行数与列数
  7. 专业的电脑网速测试网站
  8. C++实现二分法求零点(二分法求零点)
  9. 做你的树洞+更新句子 毒鸡汤
  10. [C++] LeetCode 213. 打家劫舍 II