并查集+拓扑排序 赛码 1009 Exploration
/*
题意:无向图和有向图的混合图判环; 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前,
两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为这两个点处于同一个并查集集合中,那么它们之间至少存在一条路径)
如果上一步没有判断出环,那么仅靠无向边是找不到环的
考虑到,处于同一个并查集集合中的点之间必定存在一条路径互达,因此将一个集合的点合并之后,
原问题等价于在新生成的有向图中是否有环
我们知道,有向无环图必定存在拓扑序,因此只需使用拓扑排序判定即可
时间复杂度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的更多相关文章
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- hdu 1811Rank of Tetris (并查集 + 拓扑排序)
/* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...
- 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】
题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...
- Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > ...
- Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 1811(并查集+拓扑排序)题解
Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他 ...
- HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】
Exploration Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDU——1272小希的迷宫(并查集+拓扑排序)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
随机推荐
- Bookshelf 2
Bookshelf 2 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- reverse array java
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import ...
- request-log-analyzer日志分析
(这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 日志分析是常见的工作,方法如下: 使用工具:request-log-analyzer安装:$ ...
- [BZOJ3671][UOJ#6][NOI2014]随机数生成器
[BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...
- Centos 7 安装LAMP环境
一.安装Centos 官网下载Centos 7刻录成光盘后安装 二.安装apache yum install httpd #根据提示,输入Y安装即可成功安装 systemctl start httpd ...
- 【Other】推荐点好听的钢琴曲
2013-12-13 16:19 匿名 | 浏览 138977 次 音乐钢琴 推荐点好听的钢琴曲,纯音乐也可以thanks!!! 2013-12-14 19:34 网友采纳 热心网友 巴洛克:帕海贝尔 ...
- CheckBoxList1复选框
循环绑定数据的两个方法: List<string> LIColl = new List<string>(); protected void Page_Load(object s ...
- python 异常类型
1.NameError:尝试访问一个未申明的变量>>> vNameError: name 'v' is not defined 2.ZeroDivisionError:除数为0&g ...
- Android 中SimpleDateFormat的使用注意
以前在程序中总这样使用 SimpleDateFormat sdf=new SimpleDateFormat("hh:mma"); date1=sdf.parse(alertT ...
- codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...