输入无向连通图顶点数与边数,并每行输入各边的顶点及其权值数据(顶点序号从0开始),采用Kruskal算法求解该无向连通图的最小生成树依次得到的边,并计算输出其 权值。 【输入】 4 3 0 1 3 1 2 7 2 3 4 【输出】 0-1 2-3 1-2 14 写出C语言代码
时间: 2024-12-17 09:31:33 浏览: 23
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是使用C语言实现Kruskal算法求解无向连通图的最小生成树的示例代码。这个代码首先读取顶点数、边数和边的信息,然后按照Kruskal算法的步骤排序并连接边,最后计算并输出最小生成树的总权值。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 边的数据结构
typedef struct Edge {
int u, v, w;
} Edge;
// 比较边的权值大小
bool compareEdges(const Edge *a, const Edge *b) {
return a->w < b->w;
}
// 并查集数据结构
int parent[100]; // 假设最大顶点数为99
int rank[100];
// 初始化并查集
void makeSet(int n) {
for (int i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
// 查找并合并两个集合
int findSet(int u) {
if (parent[u] != u)
parent[u] = findSet(parent[u]);
return parent[u];
}
// 判断两个集合是否相等
bool isSameSet(int u, int v) {
return findSet(u) == findSet(v);
}
// Kruskal算法
int kruskal(int vertices, Edge* edges, int edgeCount) {
makeSet(vertices);
sort(edges, edges + edgeCount, compareEdges);
int mstWeight = 0;
for (int i = 0; i < edgeCount && vertices > 1; i++) {
Edge e = edges[i];
int u = findSet(e.u);
int v = findSet(e.v);
if (!isSameSet(u, v)) {
mstWeight += e.w;
parent[u] = v; // 合并集合
vertices--;
}
}
return mstWeight;
}
int main() {
int vertices, edgeCount;
scanf("%d %d", &vertices, &edgeCount);
Edge edges[edgeCount];
for (int i = 0; i < edgeCount; i++) {
scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w);
}
int result = kruskal(vertices, edges, edgeCount);
printf("Minimum spanning tree edges:\n");
for (int i = 0; i < edgeCount && vertices > 1; i++) {
Edge e = edges[i];
printf("%d-%d\n", e.u, e.v);
}
printf("Total weight of the minimum spanning tree: %d\n", result);
return 0;
}
```
阅读全文