【算法导论】单源最短路径之Dijkstra算法

简介:         Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄。

        Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄。

迪杰斯特拉提出的按路径长度递增次序来产生源点到各顶点的最短路径的算法思想是:对有n个顶点的有向连通网络G=(V, E),首先从V中取出源点u0放入最短路径顶点集合U中,这时的最短路径网络S=({u0}, {}); 然后从uU和vV-U中找一条代价最小的边(u*, v*)加入到S中去,此时S=({u0, v*}, {(u0, v*)})。每往U中增加一个顶点,则要对V-U中的各顶点的权值进行一次修正。若加进v*作为中间顶点,使得从u0到其他属于V-U的顶点vi的路径不加v*时最短,则修改u0到vi的权值,即以(u0, v*)的权值加上(v*, vi )的权值来代替原(u0, vi )的权值,否则不修改u0到vi的权值。接着再从权值修正后的V-U中选择最短的边加入S中,如此反复,直到U=V为止。

上面的说明都很抽象,下面图解算法思想:

      原始图为:

     

寻找最短路径的过程如下:


        对第一个图中的有向网络按以上算法思想处理,所求得的从源点F到其余顶点的最短路径的过程如图13.16所示。其中单圆圈表示U中的顶点,而双圆圈表示V-U中的顶点。连接U中两个顶点的有向边用实线表示,连接U和V-U中两个顶点的有向边用虚线表示。圆圈旁的数字为源点到该顶点当前的距离值。
        初始时,S中只有一个源点F,它到V-U中各顶点的路径如图13.16(a)所示;选择图13.16(a)中最小代价边(F, B),同时由于路径(F, A)大于(F, B, A)和(F, C)大于(F, B, C),进行相应调整可得到图13.16(b);选择图13.16(b)中的最小代价边(B, C),同时由于(F, B, A)大于(F, B, C, A),进行相应调整可得到图13.16(c);选择图13.16(c)中最小代价边(C, A)即可得到图13.16(d);选择图13.16(d)中最小代价边(F, D) 即可得到图13.16(e); 最后选择(F, E)即可得到图13.16( f )。

具体的程序实现如下:

#include<stdio.h>
#define M 12//边数
#define N 6//顶点数
#define MAX 10000

void Dijkstra(int v, int dist[][N],int D[N],int p[N],int s[N]) ;
int flag[N]={0};
int flag1=0;
int flag2=0;
typedef struct
{
	int startvex;
	int endvex;
	int length;
}edge;//边的结构体
edge T[M];
void main()
{
	int dist[N][N]={{0,6,MAX,8,MAX,MAX},//图的邻接矩阵
					{18,0,7,MAX,MAX,10},
					{9,MAX,0,15,MAX,MAX},
					{MAX,MAX,12,0,MAX,MAX},
					{MAX,MAX,4,MAX,0,MAX},
					{24,5,MAX,25,MAX,0}};
	int D[N]={0};
	int p[N]={0};
	int s[N]={0};
	int num=0;
    Dijkstra(5,dist,D, p,s) ;
}


 void Dijkstra(int v, int dist[][N],int D[N],int p[N],int s[N]) 
 { 	int i, j, k, v1, min, max=10000, pre; 	/* Max中的值用以表示dist矩阵中的值 */
	v1=v; 
	for( i=0; i<N; i++)              /* 各数组进行初始化 */
	{	D[i]=dist[v1][i]; 
		if( D[i] != MAX )  p[i]= v1+1; 
		else p[i]=0; 
		s[i]=0; 
	}

	s[v1]=1;     		             /* 将源点送U */
	  for( i=0; i<N-1; i++) 	 /* 求源点到其余顶点的最短距离 */
	{	min=10001;    /* min>max, 以保证值为的顶点也能加入U */
		for( j=0; j<N-1; j++)
			  if ( ( !s[j] )&&(D[j]<min) )  		/* 找出到源点具有最短距离的边 */
		  		{min=D[j]; 
						k=j; 
		 			}
				s[k]=1;  /* 将找到的顶点k送入U */	
	for(j=0; j<N; j++)
	 if ( (!s[j])&&(D[j]>D[k]+dist[k][j]) ) /* 调整V-U中各顶点的距离值 */
		{D[j]=D[k]+dist[k][j]; 
		p[j]=k+1;                  	/* k是j的前趋 */
				}
			}                           	/*  所有顶点已扩充到U中 */
			for( i=0; i<N; i++)
			{
				printf(" %d : %d ", D[i], i);
				pre=p[i]; 
			while ((pre!=0)&&(pre!=v+1))
			{	printf ("<- %d ", pre-1); 
				pre=p[pre-1]; 
			}
			printf("<-%d \n", v); 
		}
}	 	

结果显示如下:


注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明


原文:http://blog.csdn.net/tengweitw/article/details/17510891

作者:nineheadedbird



目录
相关文章
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
5月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
190 1
|
5月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
5月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
73 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
5月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
130 0
|
7天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
7天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
|
16天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
17天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真