Hdu 1269 强连通判定

题目链接

迷宫城堡

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

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

 Accepted Code:

 1 /*************************************************************************
 2     > File Name: hdu_1269.cpp
 3     > Author: Stomach_ache
 4     > Mail: [email protected]
 5     > Created Time: 2014年08月06日 星期三 16时26分46秒
 6     > Propose: hdu 1269
 7  ************************************************************************/
 8
 9 //强连通模板题
10 #include <cmath>
11 #include <string>
12 #include <cstdio>
13 #include <vector>
14 #include <fstream>
15 #include <cstring>
16 #include <iostream>
17 #include <algorithm>
18 using namespace std;
19
20 const int maxn = 10002;
21
22 struct SCC {
23     vector<int> G[maxn];
24     vector<int> rG[maxn];
25     vector<int> vs;
26     bool used[maxn];
27     int cmp[maxn];
28     int n, m;
29
30       void init(int n) {
31           this->n = n;
32           for (int i = 0; i < n; i++) {
33               G[i].clear();
34             rG[i].clear();
35         }
36         vs.clear();
37     }
38       void AddEdge(int from, int to) {
39           G[from].push_back(to);
40         rG[to].push_back(from);
41     }
42     void dfs(int u) {
43           used[u] = true;
44           for (int i = 0; i < (int)G[u].size(); i++) {
45               if (!used[G[u][i]]) dfs(G[u][i]);
46         }
47         vs.push_back(u);
48     }
49     void rdfs(int u, int k) {
50         cmp[u] = k;
51           used[u] = true;
52         for (int i = 0; i < (int)rG[u].size(); i++) {
53               if (!used[rG[u][i]]) rdfs(rG[u][i], k);
54         }
55     }
56     int find_scc() {
57           memset(used, false, sizeof(used));
58         for (int i = 0; i < n; i++) {
59               if (!used[i]) dfs(i);
60         }
61         memset(used, false, sizeof(used));
62         int k = 0;
63         for (int i = (int)vs.size()-1; i >= 0; i--) {
64               if (!used[vs[i]]) rdfs(vs[i], k++);
65         }
66         return k;
67     }
68 };
69
70 SCC A;
71
72 int main(void) {
73       int n, m;
74       while (~scanf("%d %d", &n, &m) && (n || m)) {
75           A.init(n);
76           while (m--) {
77               int a, b;
78             scanf("%d %d", &a, &b);
79             a--; b--;
80             A.AddEdge(a, b);
81         }
82         int k = A.find_scc();
83         if (k == 1) puts("Yes");
84         else puts("No");
85     }
86
87     return 0;
88 }

Hdu 1269 强连通判定

时间: 2024-11-05 21:47:28

Hdu 1269 强连通判定的相关文章

HDU 1269 强连通分量tarjan算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6655    Accepted Submission(s): 2973 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房

hdu 1269 强连通+并查集

这是一道典型的强连通的题目.  所谓强连通,就是对于一个有向图,若一个集合内任意2点都能过互相达,于是这个几何就是一个强连通分量.  对于任意图,都可以分解 人多个不相交的强连通集合.  对于这题目,只要用著名的tarjin算法对原图进行一次强连通缩点,若说有点都在一个强连通分量,就是yes, 否者no.  这里可以用并查集. VIEW CODE //#pragma comment(linker, "/STACK:102400000,102400000") #include<cs

HDU 1269 强连通模板 Tarjan算法

求强连通量,为1输出Yes否则No Tarjan算法模板 具体讲解:https://www.byvoid.com/zht/blog/scc-tarjan #include "stdio.h" #include "string.h" struct Edge { int v,next; }edge[100010]; int head[10010],stack[10010],dfn[10010],low[10010]; // stack栈: dfn深搜次序数组:low结点

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> using namespace std; const int N = 10005; int n, m; vector<int> g[N], scc[N]; int pre[N], lowlink[N], sccno[N], d

强连通分量分解 tarjan算法 (hdu 1269)

题意: 给出一个有n个点m条边的有向图,判断该图是否只有一个强连通分量. 限制: 0 <= N <= 10000 0 <= M <= 100000 思路: tarjan算法分解强连通分量. /*强连通分量分解 tarjan算法 (hdu 1269) 题意: 给出一个有n个点m条边的有向图,判断该图是否只有一个强连通分量. 限制: 0 <= N <= 10000 0 <= M <= 100000 */ #include<iostream> #inc

hdu 1269 迷宫城堡 (tarjan算法学习)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7056    Accepted Submission(s): 3137 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu 1269 迷宫城堡

迷宫城堡 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 29   Accepted Submission(s) : 12 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房

[HDU] 迷宫城堡 HDU - 1269

迷宫城堡 HDU - 1269 时限: 1000MS   内存: 32768KB   64位IO格式: %I64d & %I64u 问题描述 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j

hdu 1012 素数判定

这道题~以前判定prime是一个个去试着整除再去存储,上次弄过欧拉函数那题目之后就知道了,这样会更快捷: 1 prime[0] = prime[1] = 1; 2 for(int i = 2; i <maxn; i++) 3 { 4 if(!prime[i]) 5 { 6 for(int j = i * 2; j < maxn; j += i) 7 prime[j] = 1; 8 } 9 } 以下是AC代码~~~水水题~ 1 #include<iostream> 2 #includ