C++代码实现最小生成树节点分类:按邻近点个数分组
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
代码解释:
- 结构体定义: 定义
Edge结构体存储边的信息,包括起点u,终点v和权重w。 - 邻接表: 使用
adj数组作为邻接表,存储每个节点的邻近节点。 - 边集合: 使用
edges向量存储所有边,便于后续排序。 - 并查集: 使用
parent数组和rank数组实现并查集,用于判断节点是否在同一连通分量中。 - Kruskal算法: 使用
kruskal函数实现Kruskal算法,找出最小生成树。 - 统计邻近点: 使用
cnt向量统计每个节点的邻近点个数。 - 分组输出: 使用
groups向量将节点按邻近点个数进行分组,并输出结果。
总结:
这段代码使用C++语言实现了最小生成树的节点分类,能够根据节点的邻近点个数将节点进行分组,方便分析图结构的特征。代码使用了并查集和邻接表等数据结构,并实现了Kruskal算法,体现了图算法的应用和实现。
原文地址: https://www.cveoy.top/t/topic/ofb9 著作权归作者所有。请勿转载和采集!