用C语言编写程序,创建一个图的节点和边,并给每条边赋予一个权重,然后采用普里姆算法创建一个最小生成树
时间: 2024-04-08 11:35:21 浏览: 10
好的,下面是用C语言编写的程序,创建一个图的节点和边,并给每条赋予一个权重,并采用普里姆法创建一个最小生成树。
```c#include <stdio.h>
#includestdlib.h>
#include <limits.h>
#define_NODES 100
// 结构体表示图的边
typedef struct {
int weight; // 边的权重
int start; // 起始节点 int end; // 终止节点
} Edge;
// 结构体表示最小生成树中的节点
typedef struct {
int parent; // 节点的父节点
int key; // 节点到父节点的权重
} MSTNode;
void createGraph(Edge graph[], int numEdges) {
printf("Enter the details of each edge (start, end, weight):\n");
for (int i = 0; i < numEdges; i++) {
scanf("%d %d %d", &graph[i].start, &graph[i].end, &graph[i].weight);
}
}
int findMinKeyVertex(int key[], int mstSet[], int numNodes) {
int minKey = INT_MAX;
int minIndex;
for (int i = 0; i < numNodes; i++) {
if (mstSet[i] == 0 && key[i] < minKey) {
minKey = key[i];
minIndex = i;
}
}
return minIndex;
}
void primMST(Edge graph[], int numNodes, int numEdges) {
MSTNode mst[numNodes];
int key[numNodes]; // 存储节点到MST的最小权重
int mstSet[MAX_NODES] = {0}; // 存储已经包括在MST中的节点
for (int i = 0; i < numNodes; i++) {
key[i] = INT_MAX;
}
// 从第一个节点开始构建MST
mst[0].parent = -1;
mst[0].key = 0;
key[0] = 0;
for (int count = 0; count < numNodes - 1; count++) {
int u = findMinKeyVertex(key, mstSet, numNodes);
mstSet[u] = 1;
for (int v = 0; v < numNodes; v++) {
if (graph[v].start == u && mstSet[graph[v].end] == 0 && graph[v].weight < key[graph[v].end]) {
mst[graph[v].end].parent = u;
mst[graph[v].end].key = graph[v].weight;
key[graph[v].end] = graph[v].weight;
}
else if (graph[v].end == u && mstSet[graph[v].start] == 0 && graph[v].weight < key[graph[v].start]) {
mst[graph[v].start].parent = u;
mst[graph[v].start].key = graph[v].weight;
key[graph[v].start] = graph[v].weight;
}
}
}
printf("Minimum Spanning Tree:\n");
for (int i = 1; i < numNodes; i++) {
printf("(%d, %d) - %d\n", mst[i].parent, i, mst[i].key);
}
}
int main() {
int numNodes, numEdges;
printf("Enter the number of nodes in the graph: ");
scanf("%d", &numNodes);
printf("Enter the number of edges in the graph: ");
scanf("%d", &numEdges);
Edge graph[numEdges];
createGraph(graph, numEdges);
primMST(graph, numNodes, numEdges);
return 0;
}
```
你可以在输入提示下,依次输入节点、边的信息。程序将输出最小生成树的边以及对应的权重。请确保输入的图是连通的,否则可能出现错误结果。