什么是最短路径?

单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值)

什么是最短路径问题?

给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离。指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题。

什么是Dijkstra算法?

求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法。该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点。

算法思想

带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合。假设V0是源点,则初始 S={V0}。用数组Distance表示源点V0到其余顶点的路径长度,用数组pre[i]表示最短路径序列上顶点i的前一个顶点。初始时,pre[i]都是源点的下标。接下来需重复两个步骤:

  1. 从当前Distance[i]找出最小的一个,记录其下标v=i,源点V0到顶点Vv的最短路径即已确定,把Vv加入S。
  2. 更新源点到剩余顶点的最短路径长度。更新方法是:以上一步的顶点Vv为中间点,若Distance[v]+weight(v,i)<Distance[i],则修改值:pre[i]=v;Distance[i]=Distance[v]+weight(v,i);

重复以上两个步骤,直至所有顶点的最短路径都已找到。
需要指出,Dijkstra算法求解的不仅是有向图,无向图也是可以的。下面给出一个完整的有向带权图的实例:

下面举例:

有向带权图

Dijkstra算法的求解过程(规定INF是infinity无穷大的意思。)

基于邻接矩阵存储的有向网络的Dijkstra算法的简单实现:

  1. const int infinity = ; //定义无穷常量,用1000表示
  2.  
  3. //定义图结构,采用邻接矩阵存储形式
  4. template <int max_size>
  5. class Graph
  6. {
  7. private:
  8. /*邻接矩阵,对于有向网络(带权的有向图)其中存放的是权值*/
  9. adjacent[max_size][max_size];
  10. public:
  11. void Dijkstra(int); //Dijkstra算法,求最短路径
  12. };
  13.  
  14. //Dijkstra算法实现(基于邻接矩阵存储的带权有向图)
  15. void Graph::Dijkstra(int vertex)
  16. {
  17. //注意:下标表示结点
  18. int count = ; //用于记录访问过的结点数目,后面用于控制循环
  19. bool find[max_size]; //用于标记已经找到最短路径的结点
  20. int pre[max_size]; //用于存放当前结点的前驱结点的最短路径
  21. int distance[max_size]; //用于存放当前结点的最短路径
  22. //初始化
  23. for(int i=;i<max_size;i++)
  24. pre[i] = vertex; //开始所有结点的前驱结点都是开始的vertex
  25. for(int i=;i<max_size;i++)
  26. distance[i] = adjacent[vertex][i]; //邻接矩阵中存放的权值就是距离
  27. for(int i=;i<max_size;i++)
  28. find[i] = false; //初始化所有结点都没有找到最短路径
  29. find[vertex] = true;
  30.  
  31. int v = vertex; //用来迭代顶点的变量
  32. int d; //用来表示距离
  33. while(count < max_size)
  34. {
  35. d = infinity;
  36. for(int i=;i<max_size;i++) //找到离最初结点最短路径的一个未访问到的结点
  37. {
  38. if(!find[i] && distance[i]<d)
  39. {
  40. d = diatance[i];
  41. v = i;
  42. }
  43. }
  44. find[v] = true;
  45. //更新剩余的结点的前驱和最短距离
  46. for(int i=;i<max_size;i++)
  47. {
  48. if(!find[i])
  49. {
  50. /*将上面找到的最短路径的结点作为起始点,
  51. *连到其他未访问过的结点上,
  52. *当比从最初结点到这个结点的路径短的时候,
  53. *就将上个结点作为前驱结点,更新一下即可*/
  54. d = distance[v] + adjacent[v][i];
  55. if(d < distance[i])
  56. {
  57. pre[i] = v;
  58. distance[i] = d;
  59. }
  60. }
  61. }
  62. count++;
  63. }
  64.  
  65. }

参考:http://blog.csdn.net/zhangxiangdavaid/article/details/38360337

有向网络(带权的有向图)的最短路径Dijkstra算法的更多相关文章

  1. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  2. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  3. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  4. HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子 ...

  5. Dijkstra 算法——计算有权最短路径(边有权值)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现: 0.2)最短路径算法的基础知识,参见 http://blog. ...

  6. HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...

  7. [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)

    1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...

  8. [算法] Dijkstra算法(带权有向图 最短路径算法)

    一.带权有向图 二.算法原理 1)由于我们的节点是从1-6,所以我们创建的列表或数组都是n+1的长度,index=0的部分不使用,循环范围为1-6(方便计算). 2)循环之前,我们先初始化dis数组和 ...

  9. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

随机推荐

  1. IntelliJ Idea清除Open Recent里面的项目列表

    2种方法清除IntelliJ Idea 中 Open Recent里面的项目列表 第一种方法: 如下图: Open Recent -> Manage Projects Recent Projec ...

  2. sit、qas、dev、pet

    SIT: System Integrate Test 系统整合测试 QAS: Quality Assurance system 质量保证 DEV: Development 开发 PET: Perfor ...

  3. (六)Redis之数据结构之Set

    一.常用方法 和List类型不同的是,Set集合中不允许出现重复的元素 添加/删除元素 获取集合中的元素 集合中的差集运算 集合中的交集运算 集合中的并集元算 扩展命令 1和2 添加/删除元素和获取集 ...

  4. (八)shiro之jdbcRealm

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  5. (二十)SpringBoot之集成mybatis:使用mybatis注解

    一.使用mybatis注解的集成 1.1 引入maven依赖 <dependencies> <dependency> <groupId>org.springfram ...

  6. CCF 201709-1 打酱油

    CCF 2017-09-1 打酱油 题目 问题描述 小明带着N元钱去买酱油.酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶.请问小明最多可以得到多少瓶酱油. 输入格式 输入的第一行 ...

  7. 使用layer.open 父页面获取子页面输入文本框中的值

    $(function () { $("#confirmpassword").click(function () { var pwd = $("#txtPwd") ...

  8. 转:让PIP源使用国内镜像,提升下载速度和安装成功率

    转载,自己记录使用,原文http://www.cnblogs.com/microman/p/6107879.html 对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太 ...

  9. 【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割

    本文链接:https://blog.csdn.net/qq_18234121/article/details/82763385 作者:冻人的蓝鲸梁思成 视频分割算法可以从时域和空域两个角度考虑.时域分 ...

  10. 通过Nginx统计网站的PV、UV、IP

    转载:通过Nginx统计网站的PV.UV.IP 概念 UV:独立访客:以cookie为依据,假设一台电脑装有3个不同的浏览器,分别打开同一个页面,将会产生3个UV.PV:访问量:页面每访问或刷新一次, ...