C++代码实现最小生成树节点分类:按邻近点个数分组

以下是将最小生成树的各个节点根据邻近点个数来分类的C++代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Edge {
    int u, v, w;
};

const int MAXN = 1005;
int n, m;
vector<int> adj[MAXN];
vector<Edge> edges;
int parent[MAXN];
int rank[MAXN];

int find(int u) {
    if (parent[u] == u) {
        return u;
    }
    return parent[u] = find(parent[u]);
}

void unite(int u, int v) {
    u = find(u);
    v = find(v);
    if (u == v) {
        return;
    }
    if (rank[u] < rank[v]) {
        parent[u] = v;
    } else if (rank[u] > rank[v]) {
        parent[v] = u;
    } else {
        parent[v] = u;
        rank[u]++;
    }
}

bool cmp(Edge e1, Edge e2) {
    return e1.w < e2.w;
}

void kruskal() {
    sort(edges.begin(), edges.end(), cmp);
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
    }
    for (int i = 0; i < m; i++) {
        int u = edges[i].u;
        int v = edges[i].v;
        int w = edges[i].w;
        if (find(u) == find(v)) {
            continue;
        }
        adj[u].push_back(v);
        adj[v].push_back(u);
        unite(u, v);
    }
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        edges.push_back({u, v, w});
    }
    kruskal();

    vector<int> cnt(n + 1, 0);
    for (int u = 1; u <= n; u++) {
        for (int i = 0; i < adj[u].size(); i++) {
            int v = adj[u][i];
            cnt[u]++;
            cnt[v]++;
        }
    }

    vector<vector<int>> groups(n + 1);
    for (int u = 1; u <= n; u++) {
        groups[cnt[u]].push_back(u);
    }

    for (int i = 1; i <= n; i++) {
        if (groups[i].size() == 0) {
            continue;
        }
        cout << "Nodes with " << i - 1 << " adjacent nodes: ";
        for (int j = 0; j < groups[i].size(); j++) {
            cout << groups[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

该代码首先使用Kruskal算法求出最小生成树,并将各个节点的邻近点存储在邻接表中。然后,对于每个节点,统计其邻近点的个数,最后将节点根据邻近点个数分组,并输出结果。

例如,如果输入如下:

6 8
1 2 2
1 3 1
2 3 3
2 4 1
3 4 2
3 5 1
4 5 4
5 6 1

则程序将输出:

Nodes with 0 adjacent nodes: 
Nodes with 1 adjacent nodes: 6 
Nodes with 2 adjacent nodes: 1 4 5 
Nodes with 3 adjacent nodes: 2 3 

代码解释:

  1. 结构体定义: 定义Edge结构体存储边的信息,包括起点u,终点v和权重w
  2. 邻接表: 使用adj数组作为邻接表,存储每个节点的邻近节点。
  3. 边集合: 使用edges向量存储所有边,便于后续排序。
  4. 并查集: 使用parent数组和rank数组实现并查集,用于判断节点是否在同一连通分量中。
  5. Kruskal算法: 使用kruskal函数实现Kruskal算法,找出最小生成树。
  6. 统计邻近点: 使用cnt向量统计每个节点的邻近点个数。
  7. 分组输出: 使用groups向量将节点按邻近点个数进行分组,并输出结果。

总结:

这段代码使用C++语言实现了最小生成树的节点分类,能够根据节点的邻近点个数将节点进行分组,方便分析图结构的特征。代码使用了并查集和邻接表等数据结构,并实现了Kruskal算法,体现了图算法的应用和实现。

C++代码实现最小生成树节点分类:按邻近点个数分组

原文地址: https://www.cveoy.top/t/topic/ofb9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录