On this page
article
Articulation Points
Sobre
Computa os pontos de articulacao (vertices criticos) de um grafo
art[i] armazena o numero de novas componentes criadas ao deletar vertice i
se art[i] >= 1, entao vertice i eh ponto de articulacao
O(n+m)
Link original: articulationPoints.cpp
Código
int n;
vector<vector<int>> g;
stack<int> s;
vector<int> id, art;
int dfs_art(int i, int& t, int p = -1) {
int lo = id[i] = t++;
s.push(i);
for (int j : g[i]) if (j != p) {
if (id[j] == -1) {
int val = dfs_art(j, t, i);
lo = min(lo, val);
if (val >= id[i]) {
art[i]++;
while (s.top() != j) s.pop();
s.pop();
}
// if (val > id[i]) aresta i-j eh ponte
}
else lo = min(lo, id[j]);
}
if (p == -1 and art[i]) art[i]--;
return lo;
}
void compute_art_points() {
id = vector<int>(n, -1);
art = vector<int>(n, 0);
int t = 0;
for (int i = 0; i < n; i++) if (id[i] == -1)
dfs_art(i, t, -1);
}