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

【算法导论】单源最短路径之Dijkstra算法的更多相关文章

  1. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  2. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  3. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  4. 单源最短路径问题-Dijkstra算法

    同样是层序遍历,在每次迭代中挑出最小的设置为已知 ===================================== 2017年9月18日10:00:03 dijkstra并不是完全的层序遍历 ...

  5. 单源最短路径问题(dijkstra算法 及其 优化算法(优先队列实现))

    #define _CRT_SECURE_NO_WARNINGS /* 7 10 0 1 5 0 2 2 1 2 4 1 3 2 2 3 6 2 4 10 3 5 1 4 5 3 4 6 5 5 6 9 ...

  6. Dijkstra算法解决单源最短路径

    单源最短路径问题:给定一个带权有向图 G = (V, E), 其中每条边的权是一个实数.另外,还给定 V 中的一个顶点,称为源.现在要计算从源到其他所有各顶点的最短路径长度.这里的长度是指路上各边权之 ...

  7. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  8. 【算法导论】单源最短路径之Bellman-Ford算法

    单源最短路径指的是从一个顶点到其它顶点的具有最小权值的路径.我们之前提到的广度优先搜索算法就是一种无权图上执行的最短路径算法,即在所有的边都具有单位权值的图的一种算法.单源最短路径算法可以解决图中任意 ...

  9. 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)

    [Bellman-Ford算法] [算法]Bellman-Ford算法(单源最短路径问题)(判断负圈) 结构: #define MAX_V 10000 #define MAX_E 50000 int ...

随机推荐

  1. Go 语言变量

    变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关键字: ...

  2. JavaScripy execCommand函数

    execCommand函数命令 execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令.处理Html数据时常用如下格式:document.execCommand(sCommand[ ...

  3. SQL_CALC_FOUND_ROWS equivalent in PostgreSQL

    https://www.postgresql.org/message-id/1185863074.10580.91.camel%40linda.lfix.co.uk On Tue, 2007-07-3 ...

  4. Windows下Java如何调用本地获取mac地址

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. CentOS 7 下使用虚拟环境Virtualenv安装Tensorflow cpu版记录

    1.首先安装pip-install 在使用centos7的软件包管理程序yum安装python-pip的时候会报一下错误: No package python-pip available. Error ...

  6. Hadoop的RPC通信原理

    RPC调用: RPC(remote procedure call)远程过程调用: 不同java进程间的对象方法的调用. 一方称作服务端(server),一方称为客户端(client): server端 ...

  7. Ubuntu和ROS一起愉快玩耍

    Ubuntu和ROS重要的两个中文网址: Ubuntu:http://cn.ubuntu.com/ROS:http://wiki.ros.org/cn Robots and drones on Ubu ...

  8. Hexo写博客

    hexo配置github Git Install hexo-deployer-git. $ npm install hexo-deployer-git –save 配置_config.yml文件 de ...

  9. zk日常运维管理

    清理数据目录 dataDir目录指定了ZK的数据目录,用于存储ZK的快照文件(snapshot).另外,默认情况下,ZK的事务日志也会存储在这个目录中.在完成若干次事务日志之后(在ZK中,凡是对数据有 ...

  10. Java并发框架——什么是AQS框架

    什么是AQS框架 1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也 ...