Dijkstra算法的一些笔记

#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&&notFound[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值