1、disti 表示当前从源到顶点i的最短特殊路径长度。在Dijkstra算法中做贪心选择时,实际上是考 虑当S添加u之后,可能出现一条到顶点的新的特殊路, 如果这条新特殊路是先经过老的 S如果 distu+cuidisti ,则需要更新 disti 的值。步骤如下:1、 用带权的邻接矩阵 c来表示带权有向图,cij表示弧上的权值。设S为已知 最短路径的终点的集合,它的初始状态为空集。从源点 v经过S到图上其余各点vi的当前最 短路径长度的初值为: disti=cvi, vi 属于 V;2、 选择 vu, 使得 distu=Mindisti | vi 属于 V-S,vj 就是长度最短的最短路径的终
2、 点。令 S=S U u ;3、 修改从 v 到集合 V-S 上任一顶点 vi 的当前最短路径长度 :如果 distu+cu jdist j 则修改 dist j= distu+cu j;4、 重复操作 (2),(3) 共 n-1 次。三、算法实现代码:#include iostreamfstreamstringusing namespace std;const int N = 5;const int M = 1000;ifstream fin(4d5.txt);templatevoid Dijkstra(int n,int v,Type dist,int prev,Type cN+1);vo
3、id Traceback(int v,int i,int prev);/ 输出最短路径 v 源点, i 终点 int main()int v = 1;/ 源点为 1int distN+1,prevN+1,cN+1N+1;cout 有向图权的矩阵为: endl;for(int i=1; i=N; i+)for(int j=1; jcij;cij;Dijkstra(N,v,dist,prev,c);for(int i=2; 源点 1 到点 i 的最短路径长度为 :disti ,其路径为 Traceback(1,i,prev);return 0;void Dijkstra(int n,int v,T
4、ype dist,int prev,Type cN+1)bool sN+1;=n;disti = cvi;/disti 表示当前从源到顶点 i 的最短特殊路径长度si = false;if(disti = M)previ = 0;/ 记录从源到顶点i的最短路径i的前一个顶点elseprevi = v;distv = 0;sv = true;n;int temp = M;int u = v;/ 上一顶点/ 取出 V-S 中具有最短特殊路径长度的顶点 uif(!sj) & (dist jtemp)u = jtemp = dist j;su = true;/ 根据作出的贪心选择更新 Dist 值 (
5、cujM)Type newdist = distu + cuj;if(newdist I;四、计算复杂性对于一个具有 n 个顶点和 e 条边的带权有向图,如果用带权邻接矩阵表示这个图,那么 Dijkstra 算法的主循环体需要 O(n) 时间。这个循环需要执行 n-1 次,所以完成循环需要0(nA2)时间。算法的其余部分所需要的时间不超过 0(n2)。五、运行结果:间图权的矩阵为10 10S0 30 100 leaa1B004-为为为为 苴八苴苴八苴八0 0 0 015 3 6为为为为 丽庫度度 0S8E00 1 -日一一口里兰口“一00曰W-W-1-取续10的的的暑 2 3 4 5 L至至至
6、至化 朋畫巔昴按 原原冃:至至1 11BB8方法2 :分支限界法一、 分支限界法解决单源最短路径问题描述:采用广度优先产生状态空间树的结点, 并使用剪枝函数的方法称为分枝限界法。 所谓“分支”是采用广度优先的策略, 依次生成扩展结点的所有分支 (即:儿子结点)。所谓“限界”是在结点扩展过程中,计算结点的上界(或下界) ,边搜索边减掉搜索树的某些分支,从而提高搜索效率按照广度优先的原则,一个活结点一旦成为扩展结点( E-结点)R后,算法将依次生成它的全部孩子结点,将那些导致不可行解或导致非最优解的儿子舍弃, 其余儿子加入活结点表中。然后,从活结点表中取出一个结点作为当前扩展结点。 重复上述结点扩
7、展过程, 直至找到问题的解或判定无解为止。二、 分支限界法算法思想描述:算法从图G的源顶点s和空优先队列开始。结点 s被扩展后,它的儿子结点被依次插 当前扩展结点相邻的所有顶点。如果从当前扩展结点 i 到顶点 j 有边可达,且从源出发,途 经顶点 i 再到顶点 j 的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点 插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。在算法扩展结点的过程中, 一旦发现一个结点的下界不小于当前找到的最短路长, 则算 法剪去以该结点为根的子树。在算法中,利用结点间的控制关系进行剪枝。从源顶点 s出发,2条不同路径到达图 G的同
8、一顶点。 由于两条路径的路长不同, 因此可以将路长长的路径所对应的树中的结点为根 的子树剪去。#include stdafx.hMinHeap2.h6d2.txtclass Graphfriend int main();public:void ShortesPaths(int);private:intn,/ 图 G 的顶点数*prev;/ 前驱顶点数组Type*c,/ 图 G 的领接矩阵*dist;/ 最短距离数组;class MinHeapNodefriend Graphoperator int ()constreturn length;int i; / 顶点编号Type length; /
9、 当前路长void Graph:ShortesPaths(int v)/ 单源最短路径问题的优先队列式分支限界法MinHeapMinHeapNode H(1000); E;/ 定义源为初始扩展节点E.i=v;E.length=0;distv=0;while (true)/ 搜索问题的解空间for (int j = 1; j = n;if (cE.i j!=0)&(E.length+cE.i jdist j) / 顶点 i 到顶点 j 可达,且满足控制约束dist j=E.length+cE.ij;prevj=E.i;/ 加入活结点优先队列 N;N.i=j;N.length=distj;H.Insert(N);tryH.DeleteMin(E); / 取下一扩展结点catch (int)break;if (H.currentsize=0)/ 优先队列空int main()int n=11;int prev12 = 0,0,0,0,0,0,0,0,0,0,0,0;int dist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000;co
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1