基础算法之Dijkstra最短路径
核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止。
设到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最短路径相关推荐
- 【基础算法】Dijkstra算法,以上海地铁换乘为例,计算最短换乘路径和时间
一.算法概述: 该算法是一个求最短路径的算法,具体算法的思想为: 找出离源点O最近的点,把该点设为S: 以S点为中转点,查看如果以S点为中转点,计算源点O中转S点到各点的距离transfer_dist ...
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...
- Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法
1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...
- 算法学习(10):LeetCode刷题之Dijkstra最短路径算法
前言: 迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径."图"这种数据结构的具体实现就是"邻接矩阵"或者"邻接 ...
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法
一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...
- aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...
- 算法基础14 —— 图论入门之弗洛伊德算法(Floyed + Dijkstra + Bellman-Ford + SPFA)
入门概念 带权图:如下图所示,我们把边带有权值的图称为带权图 可以将边的权值理解为两点之间的距离 一张图中任意两点间会有不同的路径相连 最短路径:最短路径就是指连接两点的这些路径中最短的一条 Floy ...
- Dijkstra 最短路径算法 秒懂详解
原作者:Dijkstra_Liu 原文地址:https://www.cnblogs.com/jason2003/p/7222182.html 想必大家一定会Floyd了吧,Floyd只要暴力的三个fo ...
最新文章
- 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接
- Android判断网线连接
- 『流畅的Python』第12章:继承的优缺点
- 关于深圳城中村小产权房,你应该知道的
- pl/sql查询中文乱码
- SparkStreaming读取本地文件进行wordCount
- java1.8移除apt,java 1.8上的maven-enunciate-plugin现在从最新的JDK中删除了(即java注释处理工具)...
- 使用PLC编程(ST语言)开发的DES加密解密功能块
- 用ansi语法美化你的winrar和win启动界面 【 抄袭至互联网 作者不明】
- 【Cocos2d-x】物理引擎使用入门
- js for in对象key排序
- 深度学习+语音,基础普及篇笔记(一)
- 傻子也能看懂的迪杰斯特拉算法(转)
- -克服不良习惯读后感
- java鱼雷3的几何_WFP:Geometries几何图形集合--Geometry几何图形(3)
- ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points
- python抽奖游戏大全_python实现转盘效果 python实现轮盘抽奖游戏
- UESTC 1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。
- java中double与Double的区别
- Educational Codeforces Round 132 div.2 A-F题解
热门文章
- 【Tools】MarkDown教程(八)-Typora使用完全手册
- mysql safe无法启动_(转)mysqld_safe无法启动的解决办法
- gitlens突然不显示了_损失百万!预防LED显示屏火灾隐患,从三方面入手
- activexobject对象不能创建_面向对象设计方法(Object oriented)
- adroid 如何测试端口号_多进程启动设备和appium实现自动化测试
- 宠物商店(pet-shop) 学习笔记
- java线程中的常用方法_[多线程] 线程中的常用方法-最详细
- AppleScript 以管理员身份运行程序
- 6 Git 分支 - 变基
- 《Linux内核设计与实现》读书笔记(十)- 内核同步方法