解题代码
#include<stdio.h>
#define MAXN 1000
#define ERROR -1
#define Infinite 65534
int N, M;
int G[MAXN][MAXN], dist[MAXN];
void Inicialization(void);
int Prim(void);
int FindMinDist(void);
int main()
{
scanf("%d %d", &N, &M);
Inicialization();
int total = Prim();
printf("%d", total);
return 0;
}
void Inicialization(void) {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
G[i][j] = Infinite;
int v1, v2, w;
for (int i = 0; i < M; i++) {
scanf("%d %d %d", &v1, &v2, &w);
G[v1 - 1][v2 - 1] = G[v2 - 1][v1 - 1] = w;
}
for (int i = 0; i < N; i++)
dist[i] = Infinite;
}
int Prim(void) {
int total = 0;
int count = 0;
int V;
dist[0] = 0;
count++;
for (int i = 1; i < N; i++)
dist[i] = G[0][i];
while (1) {
V = FindMinDist();
if (V == ERROR) break;
total += dist[V];
dist[V] = 0;
count++;
for (int i = 0; i < N; i++)
if (dist[i] && G[V][i] < Infinite && G[V][i] < dist[i])
dist[i] = G[V][i];
}
if (count != N) return ERROR;
return total;
}
int FindMinDist(void) {
int min=Infinite, index;
for(int i=0;i<N;i++)
if (dist[i] && dist[i] < min) {
min = dist[i];
index = i;
}
if (min == Infinite) return ERROR;
return index;
}
测试结果
问题整理
1.注意最小生成树的算法中,要判定一下生成树中结点个数是否等于总结点数,以便判断是否全都联通。