迪科斯彻算法总结

最短路之~迪科斯彻算法

迪科斯彻算法是由荷兰计算机科学家艾滋郝尔·戴克斯拉提出的。本算法使用广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。此算法常用于路由算法或者作为其他图算法一个子模块,本算法是用来找一个点到其他所有点之间的最短路径。

此算法中变量的使用:

map[][]二维数组记录两点之间的权值,例如map[i][j]存放i点到j点的权值,当作为有向图时,给出i,j需要存放的只有一个map[][],但一般情况下都是用无向图,需存两个map[][],即map[i][j]=map[j][i]=权值。

dis[]一维数组存放各点到起点的最短距离,mark[]一维数组标记使用过的点。

单源最短路:

Ⅰ、从一个点出发到其他所有点的最短路径的长度

Ⅱ、基本操作:松弛操作。

Ⅲ、dis[j] > dis[vir] + map[vir][j]这样的边(vir,j)成为紧的,可以对它进行松弛操作。

对所有点进行松弛操作的代码可参考:

for(int j = 1; j <= n; j++)

{

if(dis[j] > dis[vir] + map[vir][j] && !mark[j])

dis[j] = dis[vir] + map[vir][j];

}

Ⅳ、最开始给每一个点一个很大的dis值,从dis[s] = 0;开始,不断给可以松弛的点进行松弛操作,直至求出所有点的最短路径。

本算法要求图中不存在负权边。可证明:具有最小的dis[i]的点没有加入最短路时,此后的点无法松弛。所以每次均要寻找最近的点进行松弛操作。

具体请参考代码:

#include<stdio.h>
#define INF 0x3f3f3f3f					//定义一个较大的值,用来初始化
int map[1010][1010];					//存放两点间的权值
int dis[1010];							//存放各点距起点的距离
int mark[1010];							//标记使用过的点
int n,m;								//有n个点,编号为1~n,有m组数据
void dijkstra(int s)
{
	int vir,min;
	for(int i=1;i<=n;i++)				//初始化标记数组和距离数组
	{
		mark[i]=0;						//0表示未使用此点
		dis[i]=INF;
	}
	dis[s]=0;
	for(int i=1;i<=n;i++)
	{
		min=INF;
		for(int j=1;j<=n;j++)			//查找权值最小的点
		{
			if(!mark[j]&&dis[j]<min)
			{
				min=dis[j];
				vir=j;
			}
		}
		if(min==INF)	break;			//若没查找到或已查找完毕,跳出
		mark[vir]=1;					//将查找到的点标记
		for(int j=1;j<=n;j++)			//将未查找到并可松弛的点进行松弛操作
		{
			if(!mark[j]&&dis[j]>dis[vir]+map[vir][j])
			dis[j]=dis[vir]+map[vir][j];
		}
	}
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=1;i<=n;i++)			//初始化map数组
			for(int j=1;j<=n;j++)
				map[i][j]=INF;
		for(int i=0;i<m;i++)
		{
			int x,y,d;
			scanf("%d%d%d",&x,&y,&d);	//输入两点及权值
			if(map[x][y]>d)				//若有重复,取较短的
			{
				map[x][y]=d;
				map[y][x]=d;
			}
		}
		int start,end;
		scanf("%d%d",&start,&end);		//输入起点和终点
		dijkstra(start);				//调用迪科斯彻算法
		printf("%d\n",dis[end]);		//输出起点与终点间最短距离
	}
	return 0;
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 23:57:57

迪科斯彻算法总结的相关文章

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

迪杰斯特拉算法——PAT 1003

本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究就会发现越经典. 首先可以将整个图的节点看成两个集合:一个是S,一个是U-S.如果是求v0到图中各点的最短距离的话,那么S就是已经确认到v0距离最短的点,U-S则是对于整体的点集合U,还没有加入S集合的点. 这里提出一个算法总体的思想,将所有的点按照一定的原则加入到S集就是解集.而这个解法就是重点了

数据结构之单源最短路径(迪杰斯特拉算法)-(九)

最开始接触最短路径是在数据结构中图的那个章节中.运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题.所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法. 迪杰斯特拉算法原理(百科): 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度 (2)每个顶

迪杰斯特拉算法介绍

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

51nod 1459迷宫游戏,迪杰特斯拉算法

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间.道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得

十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法

做数据结构的课程设计顺便总结一下这四大算法,本人小白学生一枚, 如果总结的有什么错误,希望能够告知指正 普里姆算法如图所示prim 找出最短的边,再以这条边构成的整体去寻找与之相邻的边,直至连接所有顶点,生成最小生成树,时间复杂度为O(n2) 克鲁斯卡尔算法如图所示kruskal 克鲁斯卡尔算法,假设连通网N=(N,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点 自成一个连通分量.在E中选择代价最小的边,若该边依附的定顶点落在T中不同的连通分量上,

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第一个顶点为源点,最后一个顶点为终点. 由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径. 别废话了!整点实际的哈,你能很快计算出下图中由源点V0到终点V8的最短路径吗? [2]迪杰斯特拉算法 迪杰斯特拉算法是按路