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

伪代码:

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

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/a_big_pig/article/details/44163903
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞