下列代码的功能是使用Prim算法求出无向图的最小生成树权值总和,请补全。 给出的图用邻接矩阵存储。若两顶点之间没有直接路径,则对应权值为 INF,且题目保证 INF 值足够大;若找不到距离最短的顶点或者无法求出权值总和,则返回 ERROR。 typedef int WeightType; typedef int VertexType; typedef struct { int Nv; WeightType G[MAX_GRAPH_SIZE][MAX_GRAPH_SIZE]; } GNode, * MGraph; VertexType FindMinDist(MGraph Graph, WeightType dist[]) { VertexType MinV = -1, V; WeightType MinDist = INF; for (V = 0; V < Graph->Nv; V++) { if (dist[V] != 0 && dist[V] < ) { MinDist = dist[V]; ; } } if (MinDist < INF) { return MinV; } else { return ERROR; } } int Prim(MGraph Graph) { int dist[MAX_GRAPH_SIZE]; int TotalWeight = 0, VCount = 0; VertexType V, W; for (V = 0; V < Graph->Nv; V++) { dist[V] = Graph->G[0][V]; } dist[0] = 0; VCount++; while (1) { VertexType MinV; if ((MinV = FindMinDist(Graph, dist)) == ERROR) { break; } TotalWeight += dist[MinV]; ; VCount++; for (W = 0; W < Graph->Nv; W++) { if (dist[W] != 0 && ) { dist[W] = Graph->G[MinV][W]; } } } if ( ) { return ERROR; } else { return TotalWeight; } }
时间: 2023-06-12 09:07:48 浏览: 142
补全代码如下:
```c
#define INF 0x7fffffff
#define MAX_GRAPH_SIZE 100
typedef int WeightType;
typedef int VertexType;
typedef struct {
int Nv;
WeightType G[MAX_GRAPH_SIZE][MAX_GRAPH_SIZE];
} GNode, *MGraph;
VertexType FindMinDist(MGraph Graph, WeightType dist[]) {
VertexType MinV = -1, V;
WeightType MinDist = INF;
for (V = 0; V < Graph->Nv; V++) {
if (dist[V] != 0 && dist[V] < MinDist) {
MinDist = dist[V];
MinV = V;
}
}
if (MinV != -1) {
return MinV;
} else {
return ERROR;
}
}
int Prim(MGraph Graph) {
int dist[MAX_GRAPH_SIZE];
int TotalWeight = 0, VCount = 0;
VertexType V, W;
for (V = 0; V < Graph->Nv; V++) {
dist[V] = Graph->G[0][V];
}
dist[0] = 0;
VCount++;
while (1) {
VertexType MinV;
if ((MinV = FindMinDist(Graph, dist)) == ERROR) {
break;
}
TotalWeight += dist[MinV];
VCount++;
dist[MinV] = 0;
for (W = 0; W < Graph->Nv; W++) {
if (dist[W] != 0 && Graph->G[MinV][W] < INF) {
if (Graph->G[MinV][W] < dist[W]) {
dist[W] = Graph->G[MinV][W];
}
}
}
}
if (VCount < Graph->Nv) {
return ERROR;
} else {
return TotalWeight;
}
}
```
在函数 `FindMinDist` 中,需要找到 `dist` 数组中非零元素中的最小值。在找到最小值时,需要记录最小值对应的顶点编号 `MinV`。如果 `MinV` 仍然为 -1,则表示无法找到最小值,返回 ERROR。
在函数 `Prim` 中,首先初始化 `dist` 数组为顶点 0 到其他顶点的距离,然后将顶点 0 加入集合,VCount 计数器加一。接着进行循环,每次找到距离集合最近的顶点 `MinV`,将其加入集合,更新 TotalWeight 和 VCount。然后更新 `dist` 数组,即更新距离集合中顶点的最小距离。如果 VCount 小于顶点数,则表示无法构成生成树,返回 ERROR。否则返回 TotalWeight,表示最小生成树的权值总和。
阅读全文