#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
//目标图
int map[4][4]={
// A B C D
{ 0, 2,-1, 6}//A
, { 2, 0, 3, 2}//B
, {-1, 3, 0, 2}//C
, { 6, 2, 2, 0}//D
};
int i,j;
int start=0;//从A点出发
int length=sizeof(map[start])/sizeof(int);//求出点的个数,用来确定result数组的长度
int result[length];//将已经确定为最短路径的长度存入其中
for(i=0;i<length;i++){//初始化数据 ,都为-1,即都尚未求出
result[i]=-1;
}
result[start]=0;//起始点到起始点的最短路径始终为0;
int notFound[length];//存储未求出最短路径的距离
for(i=0;i<length;i++){
notFound[i]=map[start][i];//将 初始图 中 起始点 到 各个点 的距离存储进 notFound[]数组中
}
notFound[start]=-1;//起始点到起始点的最短路径距离始终为0,因此已经找到,将已经找到的距离至为-1
//开始核心代码
int minIndex;//notFound[]中最小正距离的索引
int min;// notFound[]中最小正距离
for(i=1;i<length;i++){//有length个结点,每次求出到一个结点的最短距离,最多进行length次循环
int flag=0;//判断是否给min和minIndex赋过值 (是否进入到过if语句中)
//在notFound大于零的数据中找到最小值
for(j=0;j<length;j++){
if(notFound[j]>0&&flag==1&¬Found[j]<min){//min值被第一次赋值后,notFound[j]与min比较,若小于则代替当前min值
min=notFound[j];
minIndex=j;
}
if(notFound[j]>0&&flag==0){//flag用于确定notFound中第一个大于零的数据
min=notFound[j];
minIndex=j;
flag=1;
}
}
if(flag==0){//如果没有进入循环中的if语句,即代表notFount数组中所有数据都为-1,代表遍历结束
break;//退出循环
}
result[minIndex]=min;//每次在notFound中找到的最小值 都一定是start点到minIndex点的最小距离
notFound[minIndex]=-1; //将start点到minIndex的距离设置为已经找到
//更新notFound[]
for(j=0;j<length;j++){
//1.新加入的结点到j点的距离存在 && 2.start到j点最短路径尚未求出
if(map[minIndex][j]>0&&result[j]==-1){
int newDistance=result[minIndex]+map[minIndex][j];//以新增minIndex结点为桥梁 start结点到j结点的最新距离
if(newDistance<notFound[j]||notFound[j]==-1){//start结点到j的最新距离小于旧notFound的距离时更新(-1为距离无穷大)
notFound[j]=newDistance;
}
}
}
}
for(i=0;i<length;i++){//输出result[]数组
printf("%d\n",result[i]);
}
return 0;
}
关键代码:
根据这篇文章做了一些修改
Dijkstra算法详解 通俗易懂 - 邓嘉文Jarvan的文章
https://zhuanlan.zhihu.com/p/33414118