今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理:

题目:

要求:变成计算出给出结点V1到结点V8的最短路径

答:

  首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来,如下:

  (1)v1 -> v4 -> v5 -> v3 -> v8   =>  1+12+38+8=59

  (2)v1 -> v4 -> v5 -> v7 -> v8  =>  1+12+24+20=57

  (3)v1 -> v6 -> v5 -> v7 -> v8  =>  50+1+24+20=95

  (4)v1 -> v6 -> v7 -> v8  =>  50+12+20=82

  (5)v1 -> v2 -> v3 -> v8  => 6+43+8=57

  (6)v1 -> v2 -> v5 -> v3 -> v8  =>  6+6+38+8=58

  (7)v1 -> v2 -> v5 -> v7 -> v8  =>  6+6+24+20=56(最短路径)

  (8)v1 -> v2 -> v4 -> v5 -> v3 -> v8  =>  6+11+12+24+20=75

  (9)v1 -> v2 -> v4 -> v5 -> v7 -> v8  =>  6+11+12+24+20=73

从上面列出来的路径中,很清楚的看到(7)的路径数是最短的,那么,下面我们通过Dijkstra算法来确定从V1到其他数之间的最小距离分别是多少

步骤一:

先定义两个数组:

f:表示判断是否已经找到最短路径,1表示找到,0表示暂且没找到

d:表示当前最短路径

首先,从V1开始,f的第一个一定是1,因为它与它本身的距离一定是最短的(无距离)

         d的第一个一定是0,因为V1和V1无算数概念可言,

         接着V1分别与其他路径进行计算,必须是直接路径才算,不是直接路径的只能算是无穷大

         (例如题中,V1到V2的距离为6,那么在d的数组中的距离就放入6,而V1到V3没有直接到达,需要经过V2,所以只能是无穷大)

    如图所示:

步骤二:

在输入完V1到其他数字的距离后,我们开始看d中的数字,在d的数组中,最小的数字为V4对应的1

那么,我们就把d中的V4为结点,把它相对应在f的位置从0改成1,(在f中,只要为1的,在d中相对应的数字在之后运算中都无需再改,因为它就是最短路径了)

接着,我们就可以从V1经过V4之后的所有路径进行计算了(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

    如图所示:

步骤三:

在输入V4的所有数据后,我们再次看d中的数字,在d的数组中,最小的数字为V2对应的6

那么,这次我们把V6对应的数字为结点,在f中对应的0改成1

再通过V6与其他在f中为0,d中相对应的数据进行路径长短计算(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

如图所示:

步骤四:

在输入V4的所有数据后,我们再次看d中的数字,在d的数组中,最小的数字为V5对应的12

那么,这次我们把V5对应的数字为结点,在f中对应的0改成1

再通过V5与其他在f中为0,d中相对应的数据进行路径长短计算(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

如图所示:

步骤五:

在输入V5的所有数据后,我们再次看d中的数字,在d的数组中,最小的数字为V7对应的36

那么,这次我们把V7对应的数字为结点,在f中对应的0改成1

再通过V7与其他在f中为0,d中相对应的数据进行路径长短计算(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

如图所示:

步骤六:

在输入V7的所有数据后,我们再次看d中的数字,在d的数组中,最小的数字为V3对应的49

那么,这次我们把V3对应的数字为结点,在f中对应的0改成1

再通过V3与其他在f中为0,d中相对应的数据进行路径长短计算(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

如图所示:

步骤七:

在输入V3的所有数据后,我们再次看d中的数字,在d的数组中,最小的数字为V6对应的50

那么,这次我们把V6对应的数字为结点,在f中对应的0改成1

再通过V6与其他在f中为0,d中相对应的数据进行路径长短计算(在计算过程中,若数据比原数据大,就保留原数据,否则替换原数据)

如图所示:

步骤八:

在输入V6的所有数据后,我们看到f数组中,只剩下了V8的数据为0,

那么,这次我们只要把V8在f中对应的0改成1,那么这次试题就结束了

如图所示:

结果:

以V1为开始结点到其他的结点的最短距离分别是:

V1 -> V2  =  6

V1 -> V3  =  49

V1 -> V4  = 1

V1 -> V5  =12

V1 -> V6  = 50

V1 -> V7  =  36

V1 -> V8  = 56

                                                                            END

数据结构(C#):图的最短路径问题、(Dijkstra算法)的更多相关文章

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

    # Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...

  2. 数据结构与算法--最短路径之Dijkstra算法

    数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...

  3. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

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

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

  5. 最短路径 | 深入浅出Dijkstra算法(一)

    参考网址: https://www.jianshu.com/p/8b3cdca55dc0 写在前面: 上次我们介绍了神奇的只有五行的 Floyd-Warshall 最短路算法,它可以方便的求得任意两点 ...

  6. 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)

    参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...

  7. 算法学习记录-图——最短路径之Dijkstra算法

    在网图中,最短路径的概论: 两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点. 维基百科上面的解释: 这个算法是通过为每个顶点 v 保留目前为止所找到的从 ...

  8. 最短路径问题——dijkstra算法

    仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法).开辟一个结构体,其变量为边的终点和边 ...

  9. 最短路径之Dijkstra算法及实例分析

    Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图.首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径.它的初始 ...

  10. 最短路径之Dijkstra算法

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...

随机推荐

  1. Codeforce-A-Two distinct points(暴力)

    output standard output You are given two segments [l1;r1][l1;r1] and [l2;r2][l2;r2] on the xx-axis. ...

  2. [转载]jQuery中的html,val,text区别

    在jquery中 text() 返回目标元素所包含的所有文本内容,注意不包含html标签 alert($("#shuru").text()); 1 html() 返回目标元素所包含 ...

  3. keepalived企业管理

    实践案例一:更改nginx反向代理只监听vip地址 10.0.0.3/nana.html 可以使用 10.0.0.5/nana.html  不可以使用 10.0.0.6/nana.html  不可以使 ...

  4. 「linux」后台启动nohup经常跟的>/dev/null 2>&1是什么意思

    https://www.cnblogs.com/wangsongbai/p/10215155.html 我们在写启动脚本的时候,会用nohup &,这个大家都知道,但是经常会有 >/de ...

  5. C++二维数组的动态声明

    int **a  =  new int* [m]   //分配一个指针数组,将其首地址保存在a中   . for(int i = 0; i < m; i++)   //为指针数组的每个元素分配一 ...

  6. es6数组新方法

    (1)Array.from(aarr,fn,obj) function fn(dr, sd, d) { /*Array.from 类数组转化为数组*/ console.log(arguments) v ...

  7. 几种经过整理的文件上传压缩和前台js压缩的方法

    /** * 图片压缩上传 * @param $im,图片资源 * @param int $maxwidth,最大宽度,超过这个宽度则进行压缩 * @param int $maxheight,最大高度, ...

  8. input元素的blur事件与定位在其上面的元素的点击(click)事件冲突的解决方法

    在登录和注册框中,在input上定位一个清空内容的按钮. 但是给按钮的单击事件不生效. 解决的办法: 在blur的回调函数中加一个定时器,延迟blur回调函数的执行时间,这样的话虽然在点击div的时候 ...

  9. JavaScript高级程序设计--对象创建的三种方法

    创建对象的三种方法: 1.工厂模式 工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程.下面是使用工厂函数创建对象的的一个例子. 2.构造函数: 从上面的例子中,我们看到构造函 ...

  10. 基础7 面向对象进阶与socket编程

    1.静态方法(用得少)(解除某个函数跟类的关联,加了静态方法后,类便不能将类的参数传给静态方法函数了) class Dog(object): def __init__(self,name): @sta ...