伪代码:
// 初始化,设从0开始
for i=[0,n)
dist[i] = map[0][i]
visit[0] = true;
for i=[1,n)
// 寻找最短路径(s,t),同时把t加入S集合
min = MAX_VALUE
for j=[0,n)
if !visit[j] && dist[j]<min
min = dist[j]//记录最小值和最小值的下标
min_j = j
visit[j] = true
// 松弛边(t,v),其中v为顶点
for k=[0,n)
if !visit[k] && dist[k]>dist[j]+tab[j][k]
dist[k] = dist[j]+tab[j][k]
#include <stdio.h>
#define INFINITY 0x7f7f7f7f //顶点之间不可达时,map[][]初始化为该值
#define MAXNUM 100
int map[MAXNUM][MAXNUM];//这三个数组看名字都懂的
int visited[MAXNUM];
int dist[MAXNUM];
int n,e,startp,endp;//e-边数,n-顶点数,startp-源点,endp-目标点
int dijkstra(){
int i,j,k,min,min_i;
int res = 0;
for(i = 0;i < n;i++){
dist[i] = map[startp][i];
visited[i] = 0;
}
visited[startp] = 1;
for(i = 1;i < n;i++){
min = INFINITY;
for(j = 0;j < n;j++){
if(!visited[j] && dist[j] < min){
min = dist[j];
min_i = j;
}
}
visited[min_i] = 1;
for(k = 0;k < n;k++){
if(!visited[k] && (dist[k] > (dist[min_i] + map[min_i][k])))
dist[k] = dist[min_i] + map[min_i][k];
}
}
return dist[endp];
}
注意:表示边不可达的值不能太大,整型为32的机器绝不能设置为0x7FFFFFFF,因为计算dist[k]>dist[j]+tab[j][k]时会溢出导致结果出错。