zoukankan      html  css  js  c++  java
  • Dijkstra算法的C++实现

          Dijkstra算法是在图中寻找两顶点最短路径的算法。

        下面以下图有向图为例,说明其基本思想。

          

        上图为转化为邻接矩阵存储:

        现在我要寻找1点到其他点的最短距离以及路径:

        a)1点到各点的距离分别为:  0 1 12 无穷 无穷 无穷

        b)从上述距离中寻找最小的距离,发现距离2点最近,那么选择2点作为“跳板” 

     c) 1以2作跳板后到各个点的距离分别为(即必走1->2) : 0 1 10 4 无穷 无穷

       往后的工作就是重复b) c)继续找最短的距离作为跳板,直到各个点都做过跳板为止。 那么最终这6个数字分别就是顶点1到各个点的最短距离。

        有几个问题需要注意:

        1. 步骤a)b)找到跳板后再得到c),需要改变的值只是以跳板做中间量后距离变短的值,比如说上述黄色两个部分的第三个位置,加了跳板后是10<没加跳板的12,这时候才需要改成10。假设加了跳板后的值反而比没加前变大了,那么保留原来的值。(这就是的dijkstra的“贪心算法”)。

        2. 找跳板的时候只能从没做过跳板中的元素中取。

        3.上述方法仅仅讲述了如何求得最短距离,并没有提最短路径,最短路径的实现方法将在过几天的代码中体现。

      

    以下代码以图:

    // Dijkstra.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "stdlib.h"
    #define M 999999
    int a[7][7]={0,0,0,0,0,0,0, 0,0,50,10,M,45,M, 0,M,0,15,M,10,M, 0,20,M,0,15,M,M, 0,M,20,M,0,30,M, 0,M,M,M,35,0,M, 0,M,M,M,3,M,0 }; int book[10]; int dis[10]; int i,j,k,u,min; void dijsktra() { for(i=1;i<=6;i++) { dis[i]=a[1][i]; book[i]=0; } book[1]=1; //1点的初始化 for(i=2;i<=6;i++) { min=M; for(j=2;j<=6;j++) { if(book[j]==0&&dis[j]<min) //找当前最小距离 {min=dis[j]; u=j; } } book[u]=1; for(k=1;k<=6;k++) //若跳板距离更短,那么选择跳板距离作为最短距离 即注1 { if((dis[k])>(a[u][k]+dis[u])&&(a[u][k]<M)) //单独注意a[u][k],表示以u点做跳板,跳板到k的距离 巧妙利用了邻接表 dis[k]=dis[u]+a[u][k]; } } for(i=1;i<=6;i++) { printf("%d ",dis[i]); } } int _tmain(int argc, _TCHAR* argv[]) { printf(" "); dijsktra(); system("pause"); return 0; }

    未完待续,有路径输出的在加着注释 。

    参考资料:

    https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

    http://lobert.iteye.com/blog/2315820

  • 相关阅读:
    Mac保留Python2安装Python3(Anaconda3)
    Mybatis Plugin 以及Druid Filer 改写SQL
    Jackson替换fastjson
    Java单元测试 Http Server Mock框架选型
    应用中有多个Spring Property PlaceHolder导致@Value只能获取到默认值
    RabbitMQ Policy的使用
    Collectors.toMap不允许Null Value导致NPE
    php 删除标签
    php 替换标签
    jquery拼接html
  • 原文地址:https://www.cnblogs.com/xuhongfei0021/p/7912474.html
Copyright © 2011-2022 走看看