图中连通区域集合的获取
#include <vector>
#include <stack>
std::vector<std::vector<int>>
getCompGroups(const std::vector<std::vector<int>>& adj) // adj 下标 1..n
{
int n = adj.size() - 1; // 0 号弃用
std::vector<int> vis(n + 1, 0); // 0 未访问,1 已访问
std::vector<std::vector<int>> groups;
for (int i = 1; i <= n; ++i) {
if (vis[i]) continue;
groups.emplace_back();
std::vector<int>& cur = groups.back();
std::stack<int> st;
st.push(i);
vis[i] = 1;
while (!st.empty()) {
int u = st.top(); st.pop();
cur.push_back(u); // 存 1..n 编号
for (int v : adj[u])
if (!vis[v]) {
vis[v] = 1;
st.push(v);
}
}
}
return groups;
}

浙公网安备 33010602011771号