Dijkstra算法的伪代码和C语言版本,还是模版

时间:2020-12-25 03:56:13

伪代码:


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