数据结构(十五)dijkstra单源最短路径
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单源最短路径相关推荐
- C++实现dijkstra单源最短路径算法-邻接表+优先队列
dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...
- Dijkstra单源最短路径算法
这里写目录标题 一.算法原理 二.MATLAB实现 三.参考文献 一.算法原理 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶 ...
- Dijkstra 单源最短路径算法 Java实现
Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...
- C++实现dijkstra单源最短路径
代码如下: #include <iostream> using namespace std; const int N = 30; typedef char ElemType; const ...
- C++实现有向图最短路径-Dijkstra单源最短路径算法
#include <iostream> using namespace std; #define INFINE 99999999//假装我是无穷大 const int N = 1010; ...
- Dijkstra 求单源最短路径
#include "stdafx.h" #include <iostream> using namespace std ;#include <vector> ...
- 单源路径分支界限java_java单源最短路径算法
. .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...
- 数据结构与算法—单源最短路径dijkstra算法
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
最新文章
- 【课堂笔记系列】二进制
- 每天学一点flash(23) flash.net包常用笔记
- 【Python】functools.wraps定义函数装饰器
- oracle数据库表的导入导出cmd命令大全
- 使用python获取CPU和内存信息的思路与实现(linux系统)
- 互联网日报 | 阿里国内消费者已接近10亿;联想布局半导体赛道;我国5G用户超过6千万户...
- 今天走了一天, 才回到家
- Unity 3D的常用快捷键
- Scrapy--下载器中间件(Downloader Middleware)
- ArangoDB自学笔记(万字!!全!!)
- UWP使用必应每日壁纸(二)
- API网关,网关平台API流量统一入口
- Qt: 判断字符串是否为数字,是否为整数
- 零阶保持器(ZOH)与一阶低通滤波器频率特性分析
- 抽出她裤衩里的猴皮筋做个弹弓打你们家玻璃
- 金蝶K3 SQL报表系列-客户科目余额表(可用于生成客户保证金查询报表等)
- cpython效率_PyPy 和 CPython 的性能比较测试
- 北京华夏银行卡中心之行-历史数据查询平台介绍
- Centos 安装 OpenLDAP
- UE4 - 简单的实现UI界面、镜头移动、控制权转换
热门文章
- PHP表单提交后页面跳转,PHP在表单提交后重定向到另一个页面
- 【linux】Centos 初始安装后开启网络以及配置静态IP
- 【script】python3中的docx、win32com和openpyxl模块
- java购物车商品排序_Java购物车
- java kiwi_[转] Java 8 开发的 4 大顶级技巧
- 电脑仙人掌机器人作文_满分作文精选细评:致敬奋斗的时光
- mysql 5.6 linux 64_Linux64位服务器编译安装MySQL5.6(CentOS6.4)
- bootstrap-table 列属性_bootstrap中table如何隐藏列?
- 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇
- Oracle相关练习