This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
/**
* @brief 2-node-connected components decomposition / 2-頂点連結成分分解
* @param g an adjacent list of the simple undirected graph
* @note O(V + E)
* @return list of (list of edges in the component)
*/
vector<vector<pair<int, int> > > decompose_to_two_node_connected_components(vector<vector<int> > const & g) {
int n = g.size();
vector<int> ord(n, -1);
vector<int> low(n, -1);
vector<bool> used(n);
vector<vector<pair<int, int> > > components;
stack<pair<int, int> > stk;
int k = 0;
function<void (int, int)> go = [&](int i, int parent) {
used[i] = true;
ord[i] = k ++;
low[i] = ord[i];
for (auto j : g[i]) if (j != parent) {
if (ord[j] < ord[i]) {
stk.emplace(minmax({ i, j }));
}
if (used[j]) {
chmin(low[i], ord[j]);
} else {
go(j, i);
chmin(low[i], low[j]);
if (low[j] >= ord[i]) {
components.emplace_back();
while (true) {
pair<int, int> e = stk.top();
components.back().push_back(e);
stk.pop();
if (e == minmax({ i, j })) {
break;
}
}
}
}
}
};
REP (i, n) if (not used[i]) {
go(i, -1);
}
return components;
}
#line 1 "old/two-node-connected-components.inc.cpp"
/**
* @brief 2-node-connected components decomposition / 2-頂点連結成分分解
* @param g an adjacent list of the simple undirected graph
* @note O(V + E)
* @return list of (list of edges in the component)
*/
vector<vector<pair<int, int> > > decompose_to_two_node_connected_components(vector<vector<int> > const & g) {
int n = g.size();
vector<int> ord(n, -1);
vector<int> low(n, -1);
vector<bool> used(n);
vector<vector<pair<int, int> > > components;
stack<pair<int, int> > stk;
int k = 0;
function<void (int, int)> go = [&](int i, int parent) {
used[i] = true;
ord[i] = k ++;
low[i] = ord[i];
for (auto j : g[i]) if (j != parent) {
if (ord[j] < ord[i]) {
stk.emplace(minmax({ i, j }));
}
if (used[j]) {
chmin(low[i], ord[j]);
} else {
go(j, i);
chmin(low[i], low[j]);
if (low[j] >= ord[i]) {
components.emplace_back();
while (true) {
pair<int, int> e = stk.top();
components.back().push_back(e);
stk.pop();
if (e == minmax({ i, j })) {
break;
}
}
}
}
}
};
REP (i, n) if (not used[i]) {
go(i, -1);
}
return components;
}