2.最小代价生成树 任务:建立图并求图的最小代价生成树。 功能要求: (1)建立图的存储结构(邻接矩阵或邻接表),能够输入图的顶点、边、以及边上的权值的信息,存储到相应存储结构中,并输出图的结构。 求图的最小代价生成树。请帮我用c语言写代码完成以上要求
时间: 2024-03-25 08:41:14 浏览: 122
以下是使用邻接矩阵存储图并求最小代价生成树的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAXV 100 // 最大顶点数
int graph[MAXV][MAXV]; // 存储图的邻接矩阵
int parent[MAXV]; // 存储最小生成树中每个顶点的父节点
int key[MAXV]; // 存储顶点到已知最小生成树的距离
int visited[MAXV]; // 顶点的访问状态
// 初始化图
void init_graph(int V) {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
graph[i][j] = 0;
}
}
}
// 添加边
void add_edge(int u, int v, int w) {
graph[u][v] = graph[v][u] = w;
}
// 找到未访问顶点中距离已知最小生成树最近的顶点
int min_key_vertex(int V) {
int min_key = INT_MAX;
int min_vertex = -1;
for (int i = 0; i < V; i++) {
if (!visited[i] && key[i] < min_key) {
min_key = key[i];
min_vertex = i;
}
}
return min_vertex;
}
// 求最小生成树
void prim(int V) {
// 初始化
for (int i = 0; i < V; i++) {
parent[i] = -1;
key[i] = INT_MAX;
visited[i] = 0;
}
key[0] = 0;
// 求解
for (int i = 0; i < V - 1; i++) {
int u = min_key_vertex(V);
visited[u] = 1;
for (int v = 0; v < V; v++) {
if (graph[u][v] && !visited[v] && graph[u][v] < key[v]) {
key[v] = graph[u][v];
parent[v] = u;
}
}
}
}
int main() {
int V, E;
printf("请输入顶点数和边数:");
scanf("%d %d", &V, &E);
init_graph(V);
printf("请输入边的信息:\n");
for (int i = 0; i < E; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add_edge(u, v, w);
}
prim(V);
printf("最小生成树的边为:\n");
for (int i = 1; i < V; i++) {
printf("%d - %d\n", parent[i], i);
}
return 0;
}
```
使用示例:
```
请输入顶点数和边数:6 9
请输入边的信息:
0 1 7
0 2 9
0 5 14
1 2 10
1 3 15
2 3 11
2 5 2
3 4 6
4 5 9
最小生成树的边为:
0 - 1
1 - 2
2 - 5
3 - 4
2 - 3
```
阅读全文