伪代码:
// 初始化,设从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 100int 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]时会溢出导致结果出错。