程序填空题:Prim
下列代码的功能是使用Prim算法求出无向图的最小生成树权值总和,请补全。
给出的图用邻接矩阵存储。若两顶点之间没有直接路径,则对应权值为 `INF`,且题目保证 INF 值足够大;若找不到距离最短的顶点或者无法求出权值总和,则返回 `ERROR`。
```c
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](2)) {
MinDist = dist[V];
@@[MinV = V](2);
}
}
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];
@@[dist[MinV] = 0](2);
VCount++;
for (W = 0; W < Graph->Nv; W++) {
if (dist[W] != 0 && @@[dist[W] > Graph->G[MinV][W]](2)) {
dist[W] = Graph->G[MinV][W];
}
}
}
if (@@[VCount < Graph->Nv](2)) {
return ERROR;
} else {
return TotalWeight;
}
}
```
答案:
第1空:MinDist
第2空:MinV = V
第3空:dist[MinV] = 0
第4空:dist[W] > Graph->G[MinV][W]
第5空:VCount < Graph->Nv
给出的图用邻接矩阵存储。若两顶点之间没有直接路径,则对应权值为 `INF`,且题目保证 INF 值足够大;若找不到距离最短的顶点或者无法求出权值总和,则返回 `ERROR`。
```c
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](2)) {
MinDist = dist[V];
@@[MinV = V](2);
}
}
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];
@@[dist[MinV] = 0](2);
VCount++;
for (W = 0; W < Graph->Nv; W++) {
if (dist[W] != 0 && @@[dist[W] > Graph->G[MinV][W]](2)) {
dist[W] = Graph->G[MinV][W];
}
}
}
if (@@[VCount < Graph->Nv](2)) {
return ERROR;
} else {
return TotalWeight;
}
}
```
答案:
第1空:MinDist
第2空:MinV = V
第3空:dist[MinV] = 0
第4空:dist[W] > Graph->G[MinV][W]
第5空:VCount < Graph->Nv