数据结构--图(中)--最短路径问题

最短路径问题

最短路径:  边上的权重就是距离。

最便宜:   权重是价格。

最快的路径: 通过结点最少

最短路径问题的抽象

在网络中,求两个不通顶点之间的所有路径中,边的权值之和最小的那一条路径

  这条路径就是两点之间的最短路径

  第一个顶点为源点

  最后一个顶点为终点

问题分类

  • 单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。

    • (有向)无权图
    • (有向)有权图
  • 多源最短路径问题:求任意两顶点间的最短路径。

单源最短路径在每个节点上用一遍就是多源最短路径。

单源无权图 最短路径问题

  思路是:按照递增(非递减)的顺序找到到各个顶点的最短路。

单源有权图 最短路径问题

  无权图可以看成是特殊的有全图,只不过每条权重都是1

Dijkstra算法

  • 令S={源点s+已经确定了最短路径的顶点vi}   顶点的集合
  • 任一未收录的顶点V,定义dist[v]s到v最短路径长度,但该路径经过S中的顶点,即路径{s->(vi ε S)->v }的最小长度。
  • 若路径是按照递增的顺序生成的,则
    • 真正的最短路必须只经过S中的顶点(为什么?)
    • 每次从未收录的顶点中选一个dist最小的收录(贪心)
    • 增加一个V进入S,可能影响另外一个W的dist值。

  

时间: 2024-08-07 07:15:08

数据结构--图(中)--最短路径问题的相关文章

数据结构 -- 图的最短路径 Java版

作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 (Java)现在就来看看关于求图的最短路径的问题: 注意:本人学习图的时候看的书是: <<数据结构与算法 Java语言版>> (美)Adam Drozdek/著 周翔/译 机械工业出版社出版 由于要仔细讲解内容过多并且本人水平有限,推荐大家找出这本书来看,本篇文章主要是对其中Dijk

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

图中最短路径算法(Dijkstra算法)(转)

1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) c)   所有边权非负(任取(i,j)∈E都有Wij≥0); 2)      算法描述: 在带权图中最常遇到的问题就是,寻找两点间的最短路径问题. 解决最短路径问题最著名的算法是Djikstra算法.这个算法的实现基于图的邻接矩阵表示法,它不仅能够找到任意两点的最短路径,还可以找到某个指定点到其他

[从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第一个顶点是源点,最后一个顶点是终点. 我们讲解两种求最短路径的算法.第一种,从某个源点到其余各顶点的最短路径问题. 1,迪杰斯特拉(Dijkstra)算法 迪杰斯特拉算法是一个按路径长度递增的次序产生最短路径的算法,每次找到一个距离V0最短的点,不断将这个点的邻接点加入判断,更新新加入的点到V0的距

Floyd-Warshall求图中任意两点的最短路径

原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短路径(前提是存在此路径): 2:A先通过其他点,再由其他点到B. 我们并不知道A是否需要通过其他点间接到达B,所以只能比较,用A到B的直接路径和A先通过其他点 再间接到达B的路径长度进行比较,然后更新为较小值. 上图中若要求顶点4到顶点3的最短路径,可以比较顶点4直接到3的路径和顶点4先到1,再到3

javascript实现有向无环图中任意两点最短路径的dijistra算法

有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijk

数据结构——图——最短路径D&amp;F算法

一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #define VISITED 1 #define INFINITY 66666 typedef struct tool { int visited[MAXSIZE]; /*是否已访问的数组,visited[i]表示顶点i已经访问,也就是到顶点i的最短距离已求出*/ int known_shortest_di

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边

1 # Bellman-Ford核心算法 2 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 3 # 循环n-1轮,每轮对m条边进行一次松弛操作 4 5 # 定理: 6 # 在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边 7 # 最短路径肯定是一个不包含回路的简单路径(回路包括正权回路与负权回路) 8 # 1. 如果最短路径中包含正权回路,则去掉这个回路,一定可以得到更短的路径 9 # 2. 如果最短路径中包含负权回路,则每多走一次这个回路,路径更短,则不

最短路径(图中两点间最短路径)

求解城市之间的最短距离是一个非常实际的问题,其大意如下: 某地区由n个城市,如何选择路线使某个城市到某个指定城市的的距离最短? 注意:这里需要求解的最短路径指的是两个城市之间的最短距离,而不是所有城市之间最短总距离. 1.最短路径算法 //最短路径算法 static void distMin(GraphMatrix GM,int vend){ //vend为结束点 int[] weight=new int[GraphMatrix.MaxNum]; //某终止点到各顶点的最短路径长度 int i,