题目传送门

 /*
题意:无向图和有向图的混合图判环; 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前,
两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为这两个点处于同一个并查集集合中,那么它们之间至少存在一条路径)
如果上一步没有判断出环,那么仅靠无向边是找不到环的
考虑到,处于同一个并查集集合中的点之间必定存在一条路径互达,因此将一个集合的点合并之后,
原问题等价于在新生成的有向图中是否有环
我们知道,有向无环图必定存在拓扑序,因此只需使用拓扑排序判定即可
时间复杂度O(N+M1+M2) 并查集+拓扑排序:并查集来判断无向图,拓扑排序判断有向图 另外:用读入外挂时间比scanf ()多,不清楚...
Accepted 5222 5007MS 45124K 2158 B G++ BH //scanf ()
Accepted 5222 7581MS 45116K 2158 B G++ BH //read ()
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std; const int MAXN = 1e6 + ;
const int INF = 0x3f3f3f3f;
int ans[MAXN], in[MAXN];
int rt[MAXN];
vector<int> G[MAXN];
int n, m1, m2; inline int read(void)
{
int x = , f = ; char ch = getchar ();
while (ch < '' || ch > '') {if (ch == '-') f = -; ch = getchar ();}
while (ch >= '' && ch <= '') {x = x * + ch - ''; ch = getchar ();}
return x * f;
} bool TopoSort(void)
{
memset (in, , sizeof (in));
for (int i=; i<=n; ++i)
for (int j=; j<G[i].size (); ++j) in[G[i][j]]++; queue<int> Q; int cnt = ;
for (int i=; i<=n; ++i) {if (!in[i]) Q.push (i);} while (!Q.empty ())
{
int u = Q.front (); Q.pop ();
ans[++cnt] = u;
for (int j=; j<G[u].size (); ++j)
{
int v = G[u][j];
in[v]--;
if (!in[v]) Q.push (v);
}
} if (cnt == n) return false;
else return true;
} int Find(int x)
{
return (rt[x] == x) ? rt[x] : rt[x] = Find (rt[x]);
} void Union(int x, int y)
{
x = Find (x); y = Find (y);
if (x < y) rt[x] = y;
else rt[y] = x;
} bool same(int x, int y)
{
return (Find (x) == Find (y)) ? true : false;
} int main(void) //赛码 1009 Exploration
{
//freopen ("I.in", "r", stdin); int t;
scanf ("%d", &t);
while (t--)
{
scanf ("%d%d%d", &n, &m1, &m2); for (int i=; i<=n; ++i) rt[i] = i;
for (int i=; i<=n; ++i) G[i].clear (); bool ok = false; int u, v;
for (int i=; i<=m1; ++i)
{
scanf ("%d%d", &u, &v);
//u = read (); v = read ();
//G[u].push_back (v);
if (same (u, v) == true) ok = true;
else Union (u, v);
}
for (int i=; i<=m2; ++i)
{
int u, v;
scanf ("%d%d", &u, &v);
//u = read (); v = read ();
if (same (u, v) == true) ok = true;
if (ok) continue;
G[u].push_back (v);
} if (ok) {puts ("YES"); continue;}
if (TopoSort () == true) puts ("YES");
else puts ("NO");
} return ;
}

并查集+拓扑排序 赛码 1009 Exploration的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

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

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

  3. 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】

    题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...

  4. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

  5. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

    https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...

  6. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. HDU 1811(并查集+拓扑排序)题解

    Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他 ...

  8. HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】

    Exploration Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

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

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

随机推荐

  1. BC.36.Gunner(hash)

    Gunner  Accepts: 391  Submissions: 1397  Time Limit: 8000/4000 MS (Java/Others)  Memory Limit: 65536 ...

  2. 腾讯即时聊天sdk

    一. 初始化 腾讯即时通讯sdk 1. 程序日志注册 2. 连接通知回调  专门的类管理 3. 信息通知回调 专门的类 4. 初始化sdk 5. 注册推送 分ios8/ios以前 注册推送成功回调 发 ...

  3. easyui 删除行bug

    easyui删除行,出现了bug.(经常使用这个框架的人几乎都会遇到) 我也非常纳闷,今天特地试了很久. 最后发现,如果是自己datagrid('getRows') 然后迭代出来,最后算出行号,可以成 ...

  4. 新的开始---cocos2d

    今天是一个新的开始,cocos2d的环境搭配好了,并且打包案桌apk的环境也搭配好了,安卓的这个搭配环境还是出了一点问题,前面弄了两个晚上(11-12.30)没弄出来,中间好几天都没有去弄,今天光棍节 ...

  5. facedetect

    继续学习大神的博文http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411318.html

  6. 在ubuntu 15.04下安装VMware Tools

    提出问题:在Ubuntu 15. 04版本上,不能实现剪贴板的共享 解决方法:发现没有装VMware Tools 安装VMware Tools步骤 1. 点击菜单栏,虚拟机 → 安装VMware工具 ...

  7. [另开新坑] 算导v3 #26 最大流 翻译

    26 最大流 就像我们可以对一个路网构建一个有向图求最短路一样,我们也可以将一个有向图看成是一个"流量网络(flow network)",用它来回答关于流的问题. Just as ...

  8. 隐藏Nginx/Apache版本号的安全性与方法

    一.先介绍nginx隐藏版本号的方法. 搭建好nginx或者apache,为了安全起见我们都会隐藏他们的版本号,这边讲的是nginx的版本号,如果你也想隐藏apache的版本号,那请点前面的链接.请看 ...

  9. Linux下挂载NTFS格式的U盘或硬盘

    我们知道在Linux下挂载fat32的U盘非常容易,使用mount /dev/drive_name /mnt/指定目录这样就可以挂载了,但是如果U盘或者硬盘的格式是NTFS的话,那么Linux是不能识 ...

  10. Java for LeetCode 154 Find Minimum in Rotated Sorted Array II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...