[uva] 796 – critical links

出處

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737

題意

找橋

思路

Tarjan

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

#include <iostream>
#include <utility>
#include <vector>
#ifdef LOCAL
#include "stloutput.h"
#endif
#define INF 1000000000

using namespace std;

vector<vector<int>> g;
vector<int> dfs_num, dfs_lo;
vector<pair<int, int>> ans;
int cnt;

int (int s, int t) {
dfs_num[t] = dfs_lo[t] = cnt++;
for (auto i : g[t]) {
if (dfs_num[i] == -1) {
dfs(t, i);
if (dfs_lo[i] > dfs_num[t]) {
pair<int, int> p;
if (t > i) {
p = make_pair(i, t);
} else {
p = make_pair(t, i);
}
ans.push_back(p);
}
dfs_lo[t] = min(dfs_lo[t], dfs_lo[i]);
} else if (s != i) {
dfs_lo[t] = min(dfs_lo[t], dfs_num[i]);
}
}
}

int main() {
int n;
while (cin >> n) {
int s, t, k;
g.clear();
g.resize(n);
for (int j = 0; j < n; j++) {
scanf("%d (%d)", &s, &k);
for (int i = 0; i < k; i++) {
cin >> t;
g[s].push_back(t);
}
}
dfs_num.clear();
dfs_num.resize(n, -1);
dfs_lo.clear();
dfs_lo.resize(n);
ans.clear();
cnt = 0;
for (int i = 0; i < n; i++) {
if (dfs_num[i] == -1) dfs(-1, i);
}
sort(ans.begin(), ans.end());
printf("%d critical linksn", ans.size());
for (auto i : ans) {
printf("%d - %dn", i.first, i.second);
}
puts("");
}
}