核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止。

设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径。

S集合代表已经探索过的节点,U集合表示未探索过的节点。

时间复杂度为O(n^2)

具体过程见下图和表

C++代码如下:

  1 #include<stdio.h>
  2 #define MAXDIS 4294967295
  3 using namespace std;
  4
  5 class MatrixGraphic{
  6 public:
  7     MatrxiGraphic(int number=0){
  8         this->vertexNum = number;
  9         vertex = new int[vertexNum];
 10         arc = new int *[vertexNum];
 11         for(int i=0;i<vertexNum;i++)
 12         {
 13             arc[i]=new int[vertex];
 14             for(int j=0;j<vertexNum;j++)
 15             {
 16                 arc[i][j] = MAXDIS;
 17             }
 18         }
 19     }
 20
 21     int getValueOfEdge(int start,int end)
 22     {
 23         return arc[start][end];j
 24     }
 25     int getVertexNumber()
 26     {
 27         return vertexNum;
 28     }
 29
 30     void setValueOfEdge(int start,int end,int value)
 31     {
 32         this->arc[start][end] = value;
 33     }
 34 private:
 35     int vertexNum;
 36     int *vertex;
 37     int **arc;
 38 }
 39
 40 void dijkstra(MatrixGraphic *graphic,int s,int *dist,int *prev)
 41 {
 42     int vertexNUm = graphic->getVertexNumber();
 43     bool *S = new bool[vertexNum];
 44     for(int i=0;i<vertexNum;i++)
 45     {
 46         dist[i]=graphic->getValueOfEdge(s,i);
 47         S[i]=false;
 48         if(dist[i]==MAXDIS)
 49         {
 50             prev[i]=-1;
 51         }
 52         else
 53         {
 54             prev[i]=s;
 55         }
 56     }
 57
 58     dist[s]=0;
 59     S[s] = true;
 60
 61     for(int i=1;i<vertexNum;i++)
 62     {
 63         int temp = MAXDIS;
 64         int u=s;
 65         for(int j=0;j<vertexNum;j++)
 66         {
 67             if(!S[j] && dist[j]<temp)
 68             {
 69                 u=j;
 70                 temp = dist[j];
 71             }
 72         }
 73         S[u]=true;
 74         for(int j=0;j<vertexNum;j++)
 75         {
 76             int edge = graphic->getValueOfEdge(u,j);
 77             if(!S[i] && edge<MAXDIS)
 78             {
 79                 int newDist = dist[u]+edge;
 80                 if(newDist<dist[j])
 81                 {
 82                     dist[j]=newDist;
 83                     prev[j]=u;
 84                 }
 85             }
 86         }
 87     }
 88
 89     for(int i=0;i<vertexNum;i++)
 90     {
 91         int *stack = new int[vertexNum];
 92         int top = 0;
 93         stack[top]=i;
 94         top++;
 95         int tempVertex = prev[i];
 96         while(tempVertex != s)
 97         {
 98             stack[top]=tempVertex;
 99             top++;
100             tempVertex = prev[tempVertex];
101         }
102         stack[top] = s;
103         for(int j=top;j>=0;j--)
104         {
105             if(j!=0)
106             {
107                 cout<<stack[top]<<"->";
108             }
109             else
110             {
111                 cout<<stack[top]<<endl;
112             }
113         }
114     }
115 }

View Code

转载于:https://www.cnblogs.com/yueyanglou/p/4518534.html

基础算法之Dijkstra最短路径相关推荐

  1. 【基础算法】Dijkstra算法,以上海地铁换乘为例,计算最短换乘路径和时间

    一.算法概述: 该算法是一个求最短路径的算法,具体算法的思想为: 找出离源点O最近的点,把该点设为S: 以S点为中转点,查看如果以S点为中转点,计算源点O中转S点到各点的距离transfer_dist ...

  2. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  3. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  4. Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

    1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...

  5. 算法学习(10):LeetCode刷题之Dijkstra最短路径算法

    前言: 迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径."图"这种数据结构的具体实现就是"邻接矩阵"或者"邻接 ...

  6. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  7. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)

    「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...

  8. 算法基础14 —— 图论入门之弗洛伊德算法(Floyed + Dijkstra + Bellman-Ford + SPFA)

    入门概念 带权图:如下图所示,我们把边带有权值的图称为带权图 可以将边的权值理解为两点之间的距离 一张图中任意两点间会有不同的路径相连 最短路径:最短路径就是指连接两点的这些路径中最短的一条 Floy ...

  9. Dijkstra 最短路径算法 秒懂详解

    原作者:Dijkstra_Liu 原文地址:https://www.cnblogs.com/jason2003/p/7222182.html 想必大家一定会Floyd了吧,Floyd只要暴力的三个fo ...

最新文章

  1. 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接
  2. Android判断网线连接
  3. 『流畅的Python』第12章:继承的优缺点
  4. 关于深圳城中村小产权房,你应该知道的
  5. pl/sql查询中文乱码
  6. SparkStreaming读取本地文件进行wordCount
  7. java1.8移除apt,java 1.8上的maven-enunciate-plugin现在从最新的JDK中删除了(即java注释处理工具)...
  8. 使用PLC编程(ST语言)开发的DES加密解密功能块
  9. 用ansi语法美化你的winrar和win启动界面 【 抄袭至互联网 作者不明】
  10. 【Cocos2d-x】物理引擎使用入门
  11. js for in对象key排序
  12. 深度学习+语音,基础普及篇笔记(一)
  13. 傻子也能看懂的迪杰斯特拉算法(转)
  14. -克服不良习惯读后感
  15. java鱼雷3的几何_WFP:Geometries几何图形集合--Geometry几何图形(3)
  16. ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points
  17. python抽奖游戏大全_python实现转盘效果 python实现轮盘抽奖游戏
  18. UESTC 1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。
  19. java中double与Double的区别
  20. Educational Codeforces Round 132 div.2 A-F题解

热门文章

  1. 【Tools】MarkDown教程(八)-Typora使用完全手册
  2. mysql safe无法启动_(转)mysqld_safe无法启动的解决办法
  3. gitlens突然不显示了_损失百万!预防LED显示屏火灾隐患,从三方面入手
  4. activexobject对象不能创建_面向对象设计方法(Object oriented)
  5. adroid 如何测试端口号_多进程启动设备和appium实现自动化测试
  6. 宠物商店(pet-shop) 学习笔记
  7. java线程中的常用方法_[多线程] 线程中的常用方法-最详细
  8. AppleScript 以管理员身份运行程序
  9. 6 Git 分支 - 变基
  10. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法