hdu 1269 (强联通分量Tarjan入门)

迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10075    Accepted Submission(s): 4529

Problem Description


了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单
向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请
你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间
i。

Input

输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。

Output

对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。

Sample Input

3 3

1 2

2 3

3 1

3 3

1 2

2 3

3 2

0 0

Sample Output

Yes

No

Author

Gardon

Source

HDU 2006-4 Programming Contest

模板~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #define ll long long
 7 using namespace std;
 8 const int MAXN = 12000;
 9 const int MAXM = 120000;
10 struct Edge
11 {
12     int to,next;
13 }edge[MAXM];
14 int head[MAXN],tot;
15 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];
16 int Index,top;
17 int scc;
18 bool Instack[MAXN];
19 int num[MAXN];
20
21 void addedge(int u,int v)
22 {
23     edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
24 }
25 void Tarjan(int u)
26 {
27     int v;
28     Low[u] = DFN[u] = ++Index;
29     Stack[top++] = u;
30     Instack[u] = true;
31     for(int i = head[u]; i != -1; i = edge[i].next)
32     {
33         v = edge[i].to;
34         if( !DFN[v] )
35         {
36             Tarjan(v);
37             if(Low[u] > Low[v]) Low[u] = Low[v];
38         }
39         else if(Instack[v] && Low[u] >  DFN[v])
40             Low[u] = DFN[v];
41     }
42     if(Low[u] == DFN[u])
43     {
44         scc++;
45         do
46         {
47             v = Stack[--top];
48             Instack[v] = false;
49             Belong[v] = scc;
50             num[scc]++;
51         }
52         while(v != u);
53     }
54 }
55 void solve(int N)
56 {
57     memset(DFN,0,sizeof(DFN));
58     memset(Instack,false,sizeof(Instack));
59     memset(num,0,sizeof(num));
60     Index = scc = top = 0;
61     for(int i = 1; i <= N; i++)
62         if( !DFN[i])
63         Tarjan(i);
64 }
65 void init()
66 {
67     tot = 0;
68     memset(head,-1,sizeof(head));
69 }
70 int main(void)
71 {
72     int n,m,a,b;
73     while(scanf("%d %d",&n,&m) ,n != 0 || m != 0)
74     {
75         init();
76         for(int i = 0; i < m; i++)
77         {
78             scanf("%d %d",&a,&b);
79             addedge(a,b);
80         }
81         solve(n);
82         if(scc == 1)
83             printf("Yes\n");
84         else
85             printf("No\n");
86     }
87     return 0;
88 }
时间: 2024-10-26 08:10:04

hdu 1269 (强联通分量Tarjan入门)的相关文章

bzoj 2438: [中山市选2011]杀人游戏 (强联通分量 Tarjan)

Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌握了每一个人认识谁. 每一个人都有可能是杀手,可看作他们是杀手的概率是相同的. 问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少? Input 第一行有两个整数 N,M. 接下来有 M 行,每行两个整数 x

HDU 4685 强联通分量+网络流

点击打开链接 题意:与POJ 1904 极其相像的一道题目,POJ的将一个完备匹配图给了你,并给了你一组可能的情况,很简单,但是这道题目,给的既不是完备匹配也没有给出可行的匹配方案,难的不要不要的 思路:刚开始看以为是和1904一模一样呢,然而难度上升的真快,看了一下是13年的多校题目,过了10几个把,可想而知这难度不是我等能够A掉的,刚自己想的是只加王子使其变成完备匹配,然后WA了,对了说一下为什么非要变成完备匹配呢,因为这道题目里的王子和公主的数量并不一定相同,就算相同也有可能不是完备匹配,

HDU 2767 强联通分量

点击打开链接 题意:问加多少边后图会变成强联通分量为1的图 思路:简单的强联通,缩点后找入度和出度就行了,水题 #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; co

POJ 3114 Countries in War(强联通分量+Tarjan)

题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <vector> 5 #include <stack> 6 #include <queue> 7 #inc

有向图的强联通分量 tarjan

多与DAG上的DP之类的问题一起出现. using namespace std; const int MAXE = 300010; const int MAXP = 100010; struct N { int v,next; }edge[MAXE]; int head[MAXP]; int Top; int ty[MAXP]; int high[MAXP]; int lowlink[MAXP]; int SCCans,dfsclock; int S[MAXP],STop; void InitG

HDU 1269 迷宫城堡 (强联通分量,Tarjan算法)

Problem Description: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i. Input: 输入包含多组数据

HDU 1269 迷宫城堡 【强联通分量(模版题)】

知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他. 1.  dfn[]  遍历到这个点的时间 2.  low[]  遍历到这个所能连接到的最短时间,说明那个最短时间可以遍历带他,他也可以走到那个最短时间. 3.  我们每次出栈的点就是一个强联通分量(这里建议观看一下课件里面的Tarjan求强联通算法的模拟过程). #include<cstdio> #include<cstdlib> #in

爆零后的感受外加一道强联通分量HDU 4635的题解

今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句"",弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly connected)题,这么短的题目,肯定要先看啦.然后D(LightOJ 1229),然后C(ZOJ 2243),然后F(HDU 4711),然后B(CodeForces 385D),然后看A(HDU 3889)好吧,我承认,A题看了一眼就不看了,B题一看是线段什么有点几何的味道就果断

tarjan算法求强联通分量

昨天学到了一个新的算法tarjan算法,感觉最近都没有怎么学习了...(最近有个感悟啊,就是学习一定的通过实践来进步的. 现在才明白为什么高中的时候老师强调一定要刷题,当然刷完题目之后的总结也非常地重要! 这个tarjan算法用来求强联通分量,在网上看了几篇blog,然后做了一个题目,感觉这个算法很nice啊... 如果没有学这个算法, 我肯定会想直接dfs吧orz... dfs看看是不是每个点能到达连通分量的其他点,好像这样非常麻烦啊,还要记录这个点从哪里来的...这样一想,好像直接dfs我做