1 算法原理

假设图中有顶点V={A,B,C,D,E,F},我们要求取A到其他顶点的最短距离。假设我们要求取定点A到其它顶点的最短路径,先把顶点A到源的距离设置为0,其他的距离设置为无穷大。准备两个集合S_frozeen={},S_inactive={A,B,C,D,E,F},S_frozeen我们称之为源,单源最短路径的的原理就是:每次提取S_inactive中离源S_frozeen最近的顶点,添加到源S_frozeen中,n个顶点,需要添加n次,直到S_inactive为空为止。

A、拿出S_inactive中离源S_frozeen最近的点A,得到S_frozeen={A},更新S_inactive={B,C,D,E,F}中的顶点到源S_frozeen={A}的距离;

B、继续查找里S_inactive中离S_frozeen最近的点,然后加入S_frozeen中,并更新S_inactive顶点到源的距离,如果是稀疏图可以只更新邻接顶点。

因此dijkstra的主要思想在于:把S_frozeen中的顶点,当做一整个源,往源中不断添加非源中的顶点,主要是添加的优先顺序,根据到源的最短距离。

2 代码实现

例子:http://wiki.jikexueyuan.com/project/easy-learn-algorithm/dijkstra.html。

假设源点为1,其它点到源点的最短距离:0、1、8、4、13、17。

#include <vector>
#include <limits>using namespace std;
class dijkstra{
public:dijkstra(){};~dijkstra(){};class node{public:node(){S_flag= false;distance_to_src=1e5;pre_node=-1;};~node(){};bool S_flag;int pre_node;int distance_to_src;};//求0号定点到1,2,3,4,5定点的最短路径std::vector<std::vector<int>> example_graph(){float max_number=1e5;int node_number=6;std::vector<std::vector<int>>graph(node_number);for (int i = 0; i <graph.size() ; ++i) {graph[i].resize(node_number,max_number);graph[i][i]=0;}graph[0][1]=1;graph[0][2]=12;graph[1][2]=9;graph[1][3]=3;graph[2][4]=5;graph[3][2]=4;graph[3][4]=13;graph[3][5]=15;graph[4][5]=4;return graph;}void main(){std::vector<std::vector<int>>graph=example_graph();int n=graph.size();std::vector<node>nodes(n);nodes[0].distance_to_src=0;for (int step = 0; step <n ; ++step) {//S_inactive中有n个顶点,要每次提取一个点离S_frozeen最近的点扔到源中,直到S_inactive为空,所以需要遍历n次//第一步:寻找S_inactive中离源最近的点id号min_indexint min_dist=1e5;int min_index=-1;for (int j = 0; j <n ; ++j) {if(!nodes[j].S_flag)//S_inactive中的点{if(nodes[j].distance_to_src<min_dist){min_dist=nodes[j].distance_to_src;min_index=j;}}}if(min_index<0)break;//第二步:添加min_index到S_frozeen中,并更新S_inactive到源S_frozeen的距离(只需要更新min_index的邻居顶点就可以了)nodes[min_index].S_flag=true;//添加到S_frozeenfor (int j = 0; j < n; ++j) {//更新S_inactive到源S_frozeen的距离if (!nodes[j].S_flag){int new_idst=graph[min_index][j]+nodes[min_index].distance_to_src;if(nodes[j].distance_to_src>new_idst){nodes[j].distance_to_src=new_idst;nodes[j].pre_node=min_index;}}}}for (int i = 0; i <n ; ++i) {std::cout<<nodes[i].distance_to_src<<std::endl;}}};

数据结构(十五)dijkstra单源最短路径相关推荐

  1. C++实现dijkstra单源最短路径算法-邻接表+优先队列

    dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...

  2. Dijkstra单源最短路径算法

    这里写目录标题 一.算法原理 二.MATLAB实现 三.参考文献 一.算法原理 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶 ...

  3. Dijkstra 单源最短路径算法 Java实现

    Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...

  4. C++实现dijkstra单源最短路径

    代码如下: #include <iostream> using namespace std; const int N = 30; typedef char ElemType; const ...

  5. C++实现有向图最短路径-Dijkstra单源最短路径算法

    #include <iostream> using namespace std; #define INFINE 99999999//假装我是无穷大 const int N = 1010; ...

  6. Dijkstra 求单源最短路径

    #include "stdafx.h" #include <iostream> using namespace std ;#include <vector> ...

  7. 单源路径分支界限java_java单源最短路径算法

    . .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...

  8. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  9. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

最新文章

  1. 【课堂笔记系列】二进制
  2. 每天学一点flash(23) flash.net包常用笔记
  3. 【Python】functools.wraps定义函数装饰器
  4. oracle数据库表的导入导出cmd命令大全
  5. 使用python获取CPU和内存信息的思路与实现(linux系统)
  6. 互联网日报 | 阿里国内消费者已接近10亿;联想布局半导体赛道;我国5G用户超过6千万户...
  7. 今天走了一天, 才回到家
  8. Unity 3D的常用快捷键
  9. Scrapy--下载器中间件(Downloader Middleware)
  10. ArangoDB自学笔记(万字!!全!!)
  11. UWP使用必应每日壁纸(二)
  12. API网关,网关平台API流量统一入口
  13. Qt: 判断字符串是否为数字,是否为整数
  14. 零阶保持器(ZOH)与一阶低通滤波器频率特性分析
  15. 抽出她裤衩里的猴皮筋做个弹弓打你们家玻璃
  16. 金蝶K3 SQL报表系列-客户科目余额表(可用于生成客户保证金查询报表等)
  17. cpython效率_PyPy 和 CPython 的性能比较测试
  18. 北京华夏银行卡中心之行-历史数据查询平台介绍
  19. Centos 安装 OpenLDAP
  20. UE4 - 简单的实现UI界面、镜头移动、控制权转换

热门文章

  1. PHP表单提交后页面跳转,PHP在表单提交后重定向到另一个页面
  2. 【linux】Centos 初始安装后开启网络以及配置静态IP
  3. 【script】python3中的docx、win32com和openpyxl模块
  4. java购物车商品排序_Java购物车
  5. java kiwi_[转] Java 8 开发的 4 大顶级技巧
  6. 电脑仙人掌机器人作文_满分作文精选细评:致敬奋斗的时光
  7. mysql 5.6 linux 64_Linux64位服务器编译安装MySQL5.6(CentOS6.4)
  8. bootstrap-table 列属性_bootstrap中table如何隐藏列?
  9. 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇
  10. Oracle相关练习