zoukankan      html  css  js  c++  java
  • 最短路径 之 Dijkstra算法

    Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 

          设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。

          Dijstra算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离

    基本思想是:

          设置一个顶点的集合s,并不断地扩充这个集合,一个顶点属于集合s当且仅当从源点到该点的路径已求出。开始时s中仅有源点,并且调整非s中点的最短路径长度,找当前最短路径点,将其加入到集合s,直到终点在s中。

    基本步骤:

    1、把所有结点分成两组:

          第一组:包括已经确定最短路径的结点;

          第二组:包括尚未确定最短路径的结点。

    2、开始时,第一组只包含起点,第二组包含剩余的点;

    3、用贪心的策略,按最短路径长度递增的顺序把第二组的结点加到第一组去,直到v0可达的所有结点都包含于第一组中。在这个过程中,不断更新最短路径,总保持从v0到第一组各结点的最短路径长度dist都不大于从v0到第二组任何结点的路径长度。

    4、每个结点对应一个距离值,第一组结点对应的距离就是v0到此结点的最短路径长度,第二组结点对应的距离值就是v0由第一组结点到此结点的最短路径长度。

    5、直到所有的顶点都扫描完毕(v0可达的所有结点都包含于第一组中),找到v0到其它各点的所有最短路径。

     动画演示:http://www.jcc.jx.cn/kejiandb/Dijkstra.swf

     如图:求0点到其他点的最短路径。

    最短路径-Dijkstra算法 - 刘威 - 刘威 的博客最短路径-Dijkstra算法 - 刘威 - 刘威 的博客

    (1)开始时,s1={v0},s2={v1,v2,v3,v4},v0到各点的最短路径是{0,10,&,30,100};

    (2)在还未进入s1的顶点之中,最短路径为v1,因此s1={v0,v1},由于v1到v2有路径,因此v0到各点的最短路径更新为{0,10,60,30,100};

    (3)在还未进入s1的顶点之中,最短路径为v3,因此s1={v0,v1,v3},由于v3到v2、v4有路径,因此v0到各点的最短路径更新为{0,10,50,30,90};

    (4)在还未进入s1的顶点之中,最短路径为v2,因此s1={v0,v1,v3,v2},由于v2到v4有路径,因此v0到各点的最短路径更新为{0,10,50,30,60};

    数据结构:

    (1)用一个二维数组a[i..j,i..j]来存储各点之间的距离,10000表示无通路:

    (2)用数组dist[i..j]表示最短路径;

    (3)用集合s表示找到最短路径的结点。

  • 相关阅读:
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
    源码:我的关于NLP的博客(持续更新中...)
    源码:我的关于NLP的博客(持续更新中...)
    orm功能封装
    元类
    事件,存储
    索引
    mysql课外积累
    day35作业
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134232.html
Copyright © 2011-2022 走看看