数学:Dijkstra算法

一.最短路径的最优子结构性质

该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。

假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P‘(k,s),那么P‘(i,j)=P(i,k)+P‘(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。

二. Dijkstra算法

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

先给出一个无向图

用Dijkstra算法找出以A为起点的单源最短路径步骤如下

三. 代码

Java

static int[] testDijkstra(int n,int v,int[] dist,int[] prev,int[][] c){
  
  int maxnum = 100;
  int maxint = 999999;
  
  boolean[] s = new boolean[maxnum];    // 判断是否已存入该点到S集合中
  for(int i=1; i<=n; ++i)
  {
   dist[i] = c[v][i];
   s[i] = false;     // 初始都未用过该点
   if(dist[i] == maxint)
    prev[i] = 0;
   else
    prev[i] = v;
  }
  dist[v] = 0;
  s[v] = true;
  
  // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
  // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
          // 注意是从第二个节点开始,第一个为源点
  for(int i=2; i<=n; ++i)
  {
   int tmp = maxint;
   int u = v;
   // 找出当前未使用的点j的dist[j]最小值
   for(int j=1; j<=n; ++j)
    if((!s[j]) && dist[j]<tmp)
    {
     u = j;              // u保存当前邻接点中距离最小的点的号码
     tmp = dist[j];
    }
   s[u] = true;    // 表示u点已存入S集合中
  
   // 更新dist
   for(int j=1; j<=n; ++j)
    if((!s[j]) && c[u][j]<maxint)
    {
     int newdist = dist[u] + c[u][j];
     if(newdist < dist[j])
     {
      dist[j] = newdist;
      prev[j] = u;
     }
    }
  }
  
  return dist;
 }
时间: 2024-11-09 13:13:23

数学:Dijkstra算法的相关文章

数学建模法-Dijkstra算法

一.引言 哈喽大家好,今天要讲的是图论中的一个经典的算法.是一种叫Dijkstra算法的东东.这个算法是干什么用的呢.首先大家先看下面这幅图: 这个东西是什么呢.我们可以这样理解,假如A到F表示6个地点.那些连接线就是道路.连接线上的数字就是两个地点间的距离.这样讲是不是很直观呢.好了,假如博主家在A点,博主的女神家在F点,有一天博主想去女神家,就有很多条路线可以走.可是博主很懒诶,肯定就想走最短的路线.那么,怎么才能很快的就求解出最短的路线呢.Dijkstra算法就是用来解决这样的问题的. 二

互联网IP合全局路由优化的原则-Dijkstra算法证明

周末继续写东西的一半填补了,为了达到完美的一天.我们知道一个事实,IP地址太多.统一管理是不可能的了,无论从控制平面从数据/管理层表示,飞机是如此. 所以.IP协议被设计为可伸缩.供IP路由术语,跳路由进行计算.当然,支持"源路由",源路由就是说数据在出发前就已经把路线规划好了,逐跳路由是IP路由的标准形式.也就是说.IP数据包是在路上即时规划路线的.       我比較喜欢IP路由是由于这也是我旅行的方式,我喜欢旅行,可是我不喜欢事先订酒店.事先规划路线.导航等,我的方式是在路上看路

dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学.曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award.1989年ACM SIGCSE计算机科学教育教学杰出贡献奖.以及2002年ACM PODC最具影响力论文奖. 艾兹格·W·迪科斯彻(Edsger

单源最短路径——Dijkstra算法学习

每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好理解,堪称完美. 内容摘抄如下: 网络中的最短路径是一条简单路径,即是一条不与自身相交的路径,最短路径搜索的依据:若从S点到T点有一条最短路径,则该路径上的任何点到S的距离都是最短的. Dijkstra算法搜索步骤: 1.对起始点作标记S,且对所有顶点令D(X)=∞,Y=S: 2.对所有未做标记的点按以下公式

互联网IP路由的逐跳全局最优化原则-Dijkstra算法证明

把周末写了一半的东西继续补齐了,实现了完美的一天.我们知道的一个事实就是IP地址实在太多了,根本就不可能统一的管理起来,无论从数据平面还 是从控制/管理平面上说都是这样.所以,IP协议被设计出来就是可扩展的.对于IP路由来讲,路由计算是逐跳进行的,当然也支持"源路由"选项,源路由就 是说数据在出发前就已经把路线规划好了,逐跳路由是IP路由的标准形式,也就是说,IP数据包是在路上即时规划路线的.       我比较喜欢IP路由是因为这也是我旅行的方式,我喜欢旅行,但是我不喜欢事先订酒店,

Dijkstra算法的思想和数学归纳法

ospf协议很多人都知道,很多人也会配置而且很熟练,但是很少有人懂得其背后的思想是什么,Dijkstra算法是求解单源最短路径的绝妙算法之一,我打心眼里头喜欢这个算法,真想把之一去掉.Dijkstra算法是一种贪心算法,贪心算法的本质就是最值的和还是最值,也就是说人们相信我只要在点滴当中尽自己最大的努力,那么最后的结果就是最好的,可能你会说不一定,但是你敢说如果有一个环节你没有尽最大的努力,最后的结果会更好吗?你不能,我也不能,因为现实总是很残酷,事后诸葛亮只能出现在理想状态,事情已经发生,那么

Dijkstra算法详细(单源最短路径算法)

介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它. Dijkstra能是干啥的? Dijkstra是用来求单源最短路径的 就拿上图来说,假如直到的路径和长度已知,那么可以使用dijkstra算法计算南京到图中所有节点的最短距离. 单源什么意思? 从一个顶点出发,Dijkstra算法只能求一个顶

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<