图中连通区域集合的获取

#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;
}
posted @ 2025-11-01 10:38  cuupe  阅读(3)  评论(0)    收藏  举报