ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:19.52KB ,
资源ID:16042607      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16042607.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(贪心算法和分支限界法解决单源最短路径Word格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

贪心算法和分支限界法解决单源最短路径Word格式.docx

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