赛码"BestCoder"杯中国大学生程序设计冠军赛1009——邻接表+并查集——Exploration

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++.

大意:判一个图是否有环,对于无向图来说用并查集来判,对于有向图来说用topo来判,如果这两个点有相同的父亲结点的话就说明是一个环,否则就把他们join一起,topo用邻接表实现比模拟链表方便~~复习了并查集的三个函数

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 1e6 + 10;
int ans[MAX],in[MAX];
int n,m1,m2;
int p[MAX];
vector<int> G[MAX];
int find(int x)
{
    return (x == p[x])? x:p[x] = find(p[x]);
}
void join(int x,int y)
{
  int fx = find(x);
  int fy = find(y);
  if(fx != fy)
      p[fx] = fy;
}
int judge(int x,int y)
{
    return find(x) == find(y) ? 1 :0;
}

int topo()
{
 memset(in,0,sizeof(in));
 for(int i = 1; i <= n ; i++)
     for(int j = 0 ; j < G[i].size();j++)
         in[G[i][j]]++;
 queue<int> q;
 while(!q.empty())
     q.pop();
 int cnt = 1;
 for(int i = 1; i <= n ; i++)
     if(!in[i])
        q.push(i);
while(!q.empty()){
    int u = q.front();
    q.pop();
    ans[cnt++] = u;
    for(int i = 0; i < G[u].size();i++){
        int v = G[u][i];
        in[v]--;
        if(!in[v])
            q.push(v);
    }
}
if(cnt == n ) return 0;
else return 1;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m1,&m2);
        for(int i = 1; i <= n ; i++)
            p[i] = i;
        for(int i = 1; i <= n ; i++)
            G[i].clear();
    int flag = 0;
    int u,v;
    for(int i = 1; i <= m1 ; i++){
        scanf("%d%d",&u,&v);
        if(judge(u,v) == 1) {
            flag = 1;
           break;
        }
        else    join(u,v);
    }
    for(int i = 1; i <= m2; i++){
        scanf("%d%d",&u,&v);
        if(judge(u,v) == 1){
            flag = 1;
            break;
        }
        if(flag == 1)
            break;
        G[u].push_back(v);
    }
    if(flag == 1) {printf("YES\n");continue;}
    if(topo() == 1) {
        printf("NO\n");
    }
    else printf("YES\n");
    }
    return 0;
}

  

时间: 2024-11-05 20:31:47

赛码"BestCoder"杯中国大学生程序设计冠军赛1009——邻接表+并查集——Exploration的相关文章

ACM 五一杭电赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛小记

对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今年19支World final的队伍,几乎是全国最强的46所学校各出了一个代表队,十分感谢学校给了我这个大三的老年血手这次去比赛的机会. 比赛在5.2一天内完成,上午的热身赛居然是上一场Bestcoder的原题= =.虽然我们三个人都没做过...不过我还是水水的写了前两道题. 在中午的悲惨淋雨后,下午正赛开始

(赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛)GCD

GCD Accepts: 433 Submissions: 1753 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description In mathematics, the greatest common divisor (gcd) of two or more integers, when at least one of them is not zero

HDU 5214 Movie (赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛A题)

五一有幸跟着老师去了一次杭电,求虐之行,坐等清华北大等巨巨AK全场,总结经验,激励前进! [题目链接]click here~~ [题目大意]在多个不确定区间里面,问能否选出三个互不相交的区间 [解题思路]  ps:当时是hjs敲题,敲完之后三个人都检查了一遍,发现没有问题,但是交上去却CE了,后面于是各种调,各种错误,最后发现把取模去掉,直接判断一下是否存在一个区间位于已经出来的区间中间且不交叉即可,悲剧... [官方解题报告]首先我们考虑如何选择最左边的一个区间,假设最左边的区间标号是i, 那

赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛

渣渣一枚 总共做了4个题目.先总结下吧.题目质量很高. 题目链接 1001 这个题目第一眼就是hdu之前的题目今年暑假不AC.只选三个,那么就是左右两边贪心取优. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define MOD 4294967296 using namespace std; typedef unsigned int LL; int T; i

赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛1001——Movie

Problem Description Cloud and Miceren like watching movies. Today, they want to choose some wonderful scenes from a movie. A movie has N scenes can be chosen, and each scene is associate with an interval [L, R]. L is the beginning time of the scene a

&quot;BestCoder&quot;杯中国大学生程序设计冠军赛 HDU 5221 Occupation

题目链接~~> 做题感悟 :区域赛过后就没写过树剖 ,只记得思想,比赛时想到了,但是只打代码就打了半个多小时(真是醉了!!),然后就是不断的调试代码,悲催的是调了一个多小时也没调出来..... 解题思路:这题只要想到某个节点的子树的所有节点编号都大于此节点的编号(在线段树中)且是连续的,那么我们只要深搜的时候记录一下子树最大的一个节点的时间戳(在线段树中的编号),只要我们利用一个节点的进去的时间戳和出去的时间戳就可以对这个节点的子树操作了(CF上有一个处理子树类似的题),其它的两个操作就 so

第八届福建省大学生程序设计竞赛-重现赛

第八届福建省大学生程序设计竞赛-重现赛 B   计算几何 题意:问两个三角形是相交.包含还是相离. tags:套板子..求出相交的面积,再判断一下 /* 多边形相交面积模板 */ #define maxn 510 const double eps=1E-8; int sig(double d){ return(d>eps)-(d<-eps); } struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} b

第39届ACM国际大学生程序设计竞赛 亚洲区域赛(现场赛)西安站

 第39届ACM国际大学生程序设计竞赛 亚洲区域赛(现场赛)西安赛区总结报告 报告人:田思明 队名:ACpioneer 队长:陈志阳,队员:顾振兴,田思明 西安区域赛告下帷幕,我和陈志阳,顾振兴组成的ACpioneer队最终获得了一块宝贵的铜牌.首先要感谢陈志阳和顾振兴两位杰出队友的努力训练和出色表现,我作为一个新人跟着他们学到了很多很多,也十分珍惜和他们在一起的训练,比赛时光,其次要感谢陈志老师,不辞辛劳陪我们5队和6队前往西安参加比赛,还要感谢集训队所有曾经帮过我们的所有队员们,记得cdy

2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968

异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 19    Accepted Submission(s): 9 Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai }.对于这个序列的一个连续子序列{al,al+1,…,ar }晨晨可以求出其中所有数异或的结果 alxoral+1xor...xo