[uva] 315 – network

出處

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

題意

找節點

思路

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

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

using namespace std;

void (int x, vector<vector<int>> &g, vector<int> &dfs_lo,
vector<int> &dfs_num, vector<int> &dfs_par, int &cnt,
vector<bool> &ans, int &root_kids, int &root) {
dfs_lo[x] = dfs_num[x] = cnt++;
for (auto i : g[x]) {
if (dfs_num[i] == -1) {
if (x == root) root_kids++;
dfs_par[i] = x;
dfs(i, g, dfs_lo, dfs_num, dfs_par, cnt, ans, root_kids, root);
if (dfs_lo[i] >= dfs_num[x]) {
ans[x] = 1;
}
dfs_lo[x] = min(dfs_lo[i], dfs_lo[x]);
} else if (dfs_par[x] != i) {
dfs_lo[x] = min(dfs_lo[x], dfs_num[i]);
}
}
}

int main() {
int n;
while (cin >> n, n) {
vector<vector<int>> g(n);
int m;
while (cin >> m, m) {
m--;
string s;
getline(cin, s);
stringstream ss(s);
int tmp;
while (ss >> tmp) g[m].push_back(tmp - 1), g[tmp - 1].push_back(m);
}
vector<int> dfs_lo(n), dfs_num(n, -1), dfs_par(n, -1);
vector<bool> ans(n);
int cnt = 0;
for (int i = 0; i < n; i++) {
if (dfs_num[i] == -1) {
int root_kids = 0;
dfs(i, g, dfs_lo, dfs_num, dfs_par, cnt, ans, root_kids, i);
ans[i] = (root_kids > 1);
}
}

cout << count(ans.begin(), ans.end(), 1) << endl;
}
}