题目就不多说了,
可以用这个算法演示一遍,Dijkstra
我感觉这个和prim还是有点相似之处的,关键这里多了一个记录上次最短路径的和p,光看代码没用,要知道思想
#include <stdio.h>
#define MAX_SIZE 55
#define INF 0xFFFFFF
int G[MAX_SIZE][MAX_SIZE];
int vis[MAX_SIZE];
int num[MAX_SIZE];
int n,m;
void Dijkstra()
{
for(int i = 0;i < n;i++){
if(G[m][i] != 0) num[i] = G[m][i];
else num[i] = INF;
}
vis[m] = 1;
num[m] = 0;
int p = 0;
for(int j = 1;j < n;j++){
int k,t = INF;
for(int i = 0;i < n;i++){
if(vis[i] == 0 && num[i] < t){
t = num[i];
k = i;
}
}
vis[k] = 1;
p = num[k];
for(int i = 0;i < n;i++){
if(G[k][i] != 0){
if(p+G[k][i] < num[i]){
num[i] = p+G[k][i];
}
}
}
}
return;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
scanf("%d",&G[i][j]);
}
}
Dijkstra();
for(int i = 0;i < n;i++){
if(i != m) {
if(num[i] < INF) printf("%d ",num[i]);
else printf("%d ",-1);
}
}
return 0;
}