| 1 | #define MAXN 5000 |
| 2 | int low[MAXN], num[MAXN], curnum; |
| 3 | void dfs(const vvi &adj, vi &cp, vii &bri, int u, int p) { |
| 4 | low[u] = num[u] = curnum++; |
| 5 | int cnt = 0; bool found = false; |
| 6 | rep(i,0,size(adj[u])) { |
| 7 | int v = adj[u][i]; |
| 8 | if (num[v] == -1) { |
| 9 | dfs(adj, cp, bri, v, u); |
| 10 | low[u] = min(low[u], low[v]); |
| 11 | cnt++; |
| 12 | found = found || low[v] >= num[u]; |
| 13 | if (low[v] > num[u]) bri.push_back(ii(u, v)); |
| 14 | } else if (p != v) low[u] = min(low[u], num[v]); } |
| 15 | if (found && (p != -1 || cnt > 1)) cp.push_back(u); } |
| 16 | pair<vi,vii> cut_points_and_bridges(const vvi &adj) { |
| 17 | int n = size(adj); |
| 18 | vi cp; vii bri; |
no test coverage detected