用c语言写一段完整的代码1. 建立一个无向图的邻接矩阵; 2. 以无向图的邻接矩阵为基础实现最小生成树Kruskal算法; 3. 编写测试主函数。
时间: 2024-12-11 16:26:37 浏览: 27
在C语言中,我们可以使用邻接矩阵来表示无向图,并通过Kruskal算法找到最小生成树。以下是完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define V 5 // 图的顶点数
// 邻接矩阵结构体
typedef struct {
int graph[V][V]; // 0 表示无边
} AdjMatrix;
// Kruskal 算法实现
void kruskal(AdjMatrix *adj, int n) {
int i, j, u, v, result[V], mst = 0; // 结果数组,用于存放最小生成树的边
// 初始化结果数组,所有元素设为 -1 表示未加入最小生成树
for (i = 0; i < V; i++)
result[i] = -1;
// 将所有边按权重排序并存储下标
int edges[V*V];
for (i = 0, j = 0; i < V && j < V*(V-1)/2; i++) {
for (u = 0; u < i; u++) {
if (adj->graph[u][i] != 0) {
edges[j++] = {u, i, adj->graph[u][i]};
}
}
}
// 排序边
qsort(edges, j, sizeof(edges[0]), compare_edges);
// 遍历边,每次选择权值最小的边,直到形成一棵树
for (i = 0; mst < n - 1 && i < j; i++) {
u = edges[i].node1;
v = edges[i].node2;
if (result[u] == -1 && result[v] == -1) {
// 如果这条边连接的两个节点都不在最小生成树里,则添加
result[u] = v;
result[v] = u;
mst++;
}
}
}
// 边比较函数,用于qsort
int compare_edges(const void *a, const void *b) {
return ((struct Edge*) a)->weight - ((struct Edge*) b)->weight;
}
// 主函数测试
int main() {
AdjMatrix adj;
int i, j;
// 初始化邻接矩阵(这里仅做演示,你可以根据实际需求填充)
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
adj.graph[i][j] = 0; // 都假设没有边
if (i != j) {
adj.graph[i][j] = rand() % 10 + 1; // 生成随机权重
adj.graph[j][i] = adj.graph[i][j]; // 对称的邻接矩阵
}
}
}
printf("Original adjacency matrix:\n");
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
printf("%d ", adj.graph[i][j]);
}
printf("\n");
}
kruskal(&adj, V); // 执行Kruskal算法
printf("\nMinimum spanning tree using Kruskal's algorithm:\n");
for (i = 0; i < V; i++) {
printf("Edge (%d, %d) with weight %d\n", i, result[i], adj.graph[i][result[i]]);
}
return 0;
}
```
注意:这个代码片段中,`rand()` 函数用于生成随机权重,但在实际应用中可能会替换为更合适的权重生成方式。
阅读全文