# Exploration

Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1349    Accepted Submission(s): 363

Problem Description
Miceren likes exploration and he found a huge labyrinth underground!

This labyrinth has N caves and some tunnels connecting some pairs of caves.

There are two types of tunnel, one type of them can be passed in only one direction and the other can be passed in two directions. Tunnels will collapse immediately after Miceren passing them.

Now, Miceren wants to choose a cave as his start point and visit at least one other cave, finally get back to start point.

As his friend, you must help him to determine whether a start point satisfing his request exists.

Input
The first line contains a single integer T, indicating the number of test cases.

Each test case begins with three integers N, M1, M2, indicating the number of caves, the number of undirectional tunnels, the number of directional tunnels.

The next M1 lines contain the details of the undirectional tunnels. Each line contains two integers u, v meaning that there is a undirectional tunnel between u, v. (u  v)

The next M2 lines contain the details of the directional tunnels. Each line contains integers u, v meaning that there is a directional tunnel from u to v. (u  v)

T is about 100.

1  N,M1,M2  1000000.

There may be some tunnels connect the same pair of caves.

The ratio of test cases with N > 1000 is less than 5%.

Output
For each test queries, print the answer. If Miceren can do that, output "YES", otherwise "NO".

Sample Input
2 5 2 1 1 2 1 2 4 5 4 2 2 1 2 2 3 4 3 4 1

Sample Output
YES NO
Hint
If you need a larger stack size, please use #pragma comment(linker, "/STACK:102400000,102400000") and submit your solution using C++.

Source

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=1e6+10,M=4e6+10,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int n,m1,m2,x,y;
int first[N],id;
int w[M],c[M],nxt[M];
int f[N];
bool e[N],vis[N],flag;
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void ins(int x,int y)
{
++id;
w[id]=y;
nxt[id]=first[x];
first[x]=id;
}
bool tarjan(int x)
{
vis[x]=1;
e[x]=1;
for(int z=first[x];z;z=nxt[z])
{
int y=w[z];
if(vis[y]==0&&tarjan(y))return 1;
if(e[y])return 1;
}
e[x]=0;
return 0;
}
int main()
{
scanf("%d",&casenum);
for(casei=1;casei<=casenum;++casei)
{
scanf("%d%d%d",&n,&m1,&m2);
for(int i=1;i<=n;i++)f[i]=i;
flag=0;
for(int i=1;i<=m1;i++)
{
scanf("%d%d",&x,&y);
x=find(x);
y=find(y);
if(x==y)flag=1;
else f[y]=x;
}
if(flag)
{
for(int i=1;i<=m2;i++)scanf("%*d%*d");
printf("YES\n");
continue;
}
for(int i=1;i<=n;i++)
{
f[i]=find(i);
first[i]=0;
vis[i]=0;
e[i]=0;
}
for(int i=1;i<=m2;i++)
{
scanf("%d%d",&x,&y);
x=f[x];
y=f[y];
ins(x,y);
}
for(int i=1;i<=n;i++)if(vis[i]==0&&tarjan(i))
{
flag=1;
break;
}
puts(flag?"YES":"NO");
}
return 0;
}
/*
【trick&&吐槽】

【题意】

【类型】

【分析】

【时间复杂度&&优化】
O(n+m1+m2)

*/

• 本文已收录于以下专栏：

## Tarjan(无向图)有向图缩环/求(边双)强连通分量

• jokerwyt
• 2016年09月12日 19:15
• 1076

## 连通性Tarjan算法 双连通与强连通

/*     author:yjc     time:2014/3/29     title:双连通性算法     双连通：定义DFN(u)为u在搜索树（以下简称为树）中被遍历到的次序号。 ...
• u011021130
• 2014年05月07日 23:39
• 801

## tarjan算法（边的双连通分量）

hiho链接：http://hihocoder.com/contest/hiho53/problem/1 边的双连通分量定义：对于一个无向图的子图，当删除其中任意一条边后，不改变图内点的连通...
• qwe2434127
• 2015年08月09日 18:05
• 1367

## Tarjan三大算法之双连通分量（双连通分量）

• fuyukai
• 2016年05月03日 16:18
• 9270

## 超详细Tarjan算法总结，求强连通分量，割点，割边，有重边的割边

Tarjan是一个人，他一身中发明了很多算法，就这几个算法最为出名。 1、求有向图的强连通分量，那么什么是强连通分量呢，就是一个顶点集合，任意两个顶点间都可以互相到达。如果图中任意两点可以互相到达，则...
• lw277232240
• 2017年06月14日 19:50
• 436

## 强连通分量及缩点tarjan算法解析

• qq574857122
• 2013年11月16日 22:49
• 11358

## poj 3895 Cycles of Lanes 修改tarjan算法求图中最大环

• sepNINE
• 2015年04月07日 11:58
• 1011

## 双DFS求强连通分量

• zzuchengming
• 2015年07月07日 20:43
• 1039

## 判断无向图是否有环路的方法 -并查集 -BFS

• xyt8023y
• 2015年06月01日 16:14
• 2356

## 求强连通子图的方法以及简单实现

• qq_34271269
• 2016年07月26日 23:52
• 670

举报原因： 您举报文章：【HDU5222 2015赛码冠军杯I】【并查集找双连通 + tarjan求强连通】Exploration 双向边只能走一边是否图上存在环 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)