用prim算法求给定无向连通网的最小生成树,输入无向连通网的顶点数,起始顶点及无向连通网各边的权值,C语言
时间: 2023-07-15 14:11:19 浏览: 130
动态规划-最小生成树
以下是使用Prim算法求给定无向连通网的最小生成树的示例代码:
```c
#define MAXV 100 // 最大顶点数
#define INF 0x3f3f3f3f // 无穷大
int G[MAXV][MAXV]; // 存储图的邻接矩阵
int d[MAXV]; // 存储到已选顶点集合的最小距离
int parent[MAXV]; // 存储每个顶点在最小生成树中的父节点
bool visited[MAXV]; // 标记顶点是否已被加入最小生成树中
int prim(int n, int start) {
int sum = 0;
memset(visited, false, sizeof(visited));
memset(d, INF, sizeof(d));
memset(parent, -1, sizeof(parent));
d[start] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || d[j] < d[u])) {
u = j;
}
}
visited[u] = true;
sum += d[u];
for (int v = 0; v < n; v++) {
if (!visited[v] && G[u][v] != INF && G[u][v] < d[v]) {
d[v] = G[u][v];
parent[v] = u;
}
}
}
return sum;
}
```
其中,`G`是一个二维数组,存储无向连通网的邻接矩阵;`d`是一个一维数组,存储到已选顶点集合的最小距离;`parent`是一个一维数组,存储每个顶点在最小生成树中的父节点;`visited`是一个一维数组,标记顶点是否已被加入最小生成树中。`n`是无向连通网的顶点数,`start`是起始顶点。
代码中,首先初始化各数组。然后从起始顶点开始,遍历所有顶点,选择距离已选顶点集合最近的未加入最小生成树的顶点,将其加入最小生成树,并更新与该顶点相邻的未加入最小生成树的顶点的最小距离和父节点。最后返回最小生成树的权值和。
阅读全文