最短路径问题-Dijkstra(基于图的ADT)

基于贪心法的单源最短路径算法

(1)最短路径问题具有最优子结构性质,即最短路径的子路径仍然是最短路径

(2)最短路径问题具有贪心选择性质,为了求的最短路径,Dijkstra提出以最短路径长度递增,逐次生成最短路径的算法

   

图的ADT以及实现详见:基于相邻矩阵实现图的ADT

Dijkstra算法代码:

 1 int minVertex(Graphm* g,int *D){
 2     int i,v;
 3     for(int i=0;i<g->n();i++){
 4         if(g->getMark(i)==0){
 5             v=i;break;
 6         }
 7     }
 8     for(i++;i<g->n();i++){
 9         if(g->getMark(i)==0&&(D[i]<D[v]))v=i;
10     }
11     return v;
12 }
13 void Dijkstra(Graphm*g,int *D,int s){
14         int i,v,w;
15         for(int i=0;i<g->n();i++){
16             D[i]=INFINITY;
17         }
18         D[s]=0;
19         for(int i=0;i<g->n();i++){
20             v=minVertex(g,D);
21             if(D[v]==INFINITY)return ;
22             g->setMark(v,1);
23             for(w=g->first(v);w<g->n();w=g->next(v,w)){
24                 if(D[w]>(D[v]+g->getEdge(v,w)))
25                     D[w]=D[v]+g->getEdge(v,w);
26             }
27         }
28 }

性能分析:

通过扫描整个包含|V|个元素的表来搜索最小值

cost:O(|V|^2+|E|)=O(|V|^2)

Dijkstra算法只适合非负权值的图

原文地址:https://www.cnblogs.com/bo2000/p/10124041.html

时间: 2024-10-14 22:35:31

最短路径问题-Dijkstra(基于图的ADT)的相关文章

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

带权图的最短路径算法(Dijkstra)实现

一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的.不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现):而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”.本文采用最小堆主辅助,以重新构造堆的方式实现更新邻接点权值. 对于图而言,存在有向图和无向图.本算法只需要修改一行代码,即可同时实

图的单源最短路径:Dijkstra算法实现

本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法. 算法核心思想参见维基.简而言之,设集合S存放已经求出了最短路径的点.初始状态S中只有一个点v0,之后每求得v0到vn的最短路径,就会更新v0到所有vn邻接的点的一致的最短路径(不一定是最终的最短路径),如此重复,每次会确定v0到一个点的最短路径,确定好的点加入S中,直至所有点进入S结束.在本文中

python数据结构与算法——图的最短路径(Dijkstra算法)

1 # Dijkstra算法——通过边实现松弛 2 # 指定一个点到其他各顶点的路径——单源最短路径 3 4 # 初始化图参数 5 G = {1:{1:0, 2:1, 3:12}, 6 2:{2:0, 3:9, 4:3}, 7 3:{3:0, 5:5}, 8 4:{3:4, 4:0, 5:13, 6:15}, 9 5:{5:0, 6:4}, 10 6:{6:0}} 11 12 13 # 每次找到离源点最近的一个顶点,然后以该顶点为重心进行扩展 14 # 最终的到源点到其余所有点的最短路径 15

贪心算法-图的最短路径算法Dijkstra之证明

一.问题:图的最短路径 定义图G=(V,E),而且每条边上的权值非负,求顶点s 到图中任意一点的最短距离.图中任意两点之间的距离定义为:路径上所有边的权值的和. 二.算法:Dijkstra算法 设S是探查的顶点的集合,对每个,我们存储一个距离d(u) 初始S={s},d(s)=0 While S != V 选择一个顶点使得从S到v至少有一条边并且 把v加入到S并且定义 End 三.证明算法的正确性: 只需证明,在算法执行中任意一点的集合S,对每个,路径是最短的s-u路径. 用数学归纳法证明算法的

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

最短路径之Dijkstra算法

Dijkstra算法: 首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的的长度:如D[3]=2表示从始点v到终点3的路径相对最小长度为2.这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于长度.它的初始状态为:若从v到vi有弧,则D为弧上的权值:否则置D为∞.显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条.此路径为(v,vj). 那么,下一条长度次短的是哪一条呢?假设该次短路径的终点是vk,

最短路径问题-Dijkstra

概述 与前面说的Floyd算法相比,Dijkstra算法只能求得图中特定顶点到其余所有顶点的最短路径长度,即单源最短路径问题. 算法思路 1.初始化,集合K中加入顶点v,顶点v到其自身的最短距离为0,到其它所有顶点为无穷. 2.遍历与集合K中结点直接相邻的边(U,V,C),其中U属于集合K,V不属于集合K,计算由结点v出发,按照已经得到的最短路径到达U,再由U经过该边达到V时的路径长度.比较所有与集合K中结点直接相邻的非集合K结点该路径长度,其中路径长度最小的顶点被确定为下一个最短路径确定的结点

单源最短路径算法---Dijkstra

Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[i]表示)已经确定.算法反复选择具有最短路径估计的顶点u 属于 V-S(即未确定最短路径的点,程序中finish[i]=false的点),并将u加入到S中(用finish[i]=true表示),最后对u的所有输出边进行松弛. 程序实现:      输入数据: 5 7 0