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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(有向图中任意令两点之间的最短路径Read.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

有向图中任意令两点之间的最短路径Read.docx

1、有向图中任意令两点之间的最短路径Read有向图中任意两点之间的最短路径一. 问题求出有向图中任意两点之间的最短路径并打印结果二. 语言环境C+三. 问题分析要解决有向图中任意两点之间的最短路径问题首先应解决的问题是1. 从源点到其余各点的最短路径问题2. 每一对定点之间的最短路径问题对于”从源点到其余各点的最短路径问题” 有经典算法-“迪杰斯特拉算法”.该算法的思想是: (1). 如图(A) 图(A )路径长度最短的最短路径的特点:在这条路径上,必定只含一条弧,并且这条弧的权值最小。 下一条路径长度次短的最短路径的特点:它只可能有两种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经

2、过顶点v1,再到达该顶点(由两条弧组成)。再下一条路径长度次短的最短路径的特点:它可能有三种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是从源点经过顶点v2,再到达该顶点。其余最短路径的特点:它或者是直接从源点到该点(只含一条弧); 或者是从源点经过已求得最短路径的顶点,再到达该顶点。由以上特点可知:假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为x)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达终点x的路径。 假设此路径上有一个顶点不在S中,则说明存在一条终点不在S中,而长度比此路径短的路径。但这

3、是不可能的,因为我们是按路径长度递增的次序来产生最短路径的,故长度比此路径短的所有路径均已产生,他们的终点必定在S中,即假设不成立。设置辅助数组Dist,其中每个分量Distk 表示 当前所求得的从源点到其余各顶点 k 的最短路径。一般情况下,Distk = 或者 = + 。()在所有从原点出发的弧中选取一条权值最小的弧即为第一条最短路径(如图(a ) V0和k之间存在弧 V0和k之间不存在弧其中的最小值即为最短路径的长度。()修改其它各顶点的Distk值。假设求得最短路径的顶点为u,若 Distu+G.arcsukDistk则将 Distk 改为 Distu+G.arcsuk。迪杰斯特拉算法

4、程序段Shortpath(Mgraph G,int v0, int path, int dist)/pathv为从v0到v的最短路径的前驱顶点,/distv为其当前的最短距离.s为全局变量,sv=1,/表示v已在S集合中,即已求得从v0到v的最短距离。 For(v=0;vG.vexnum;+v) sv=0; distv=G.arcsv0v; If(distvinfinity) pathv=v0; /v0是v的前驱 else pathv=-1; /v无前驱 distv0=0; sv0=1; /S集中开始时只有v0 For(i=1;iG.vexnum;+i) min=infinity; for(w

5、=0;wG.vexnum;+w) if(sw=0) /wV-S if(distwmin) v=w; min=distw; sv=1; /将v加入S for(w=0;wG.vexnum;+w) /调整其余在V-S的点 if(sw=0 &(distv+G.arcsvwdistw) distw= distv + G.arcsvw; pathw=v; 步骤第一步第二步第三步第四步第五步v1无v210(v0,v2)v360(v0,v2,v3)50(v0,v4,v3)v430(v0,v4)30(v0,v4)v5100(v0,v5)100(v0,v5)90(v0,v4,v5)60(v0,v4,v3,v5)v

6、jv2v4v3v5Sv0,v2v0,v2,v4v0,v2,v4,v3v0,v2,v4,v3,v5对于”每一对定点之间的最短路径问题”有经典算法弗洛伊德算法从 vi 到 vj 的所有可能存在的路径中,选出一条长度最短的路径。若存在,则存在路径vi,vj / 路径中不含其它顶点若,存在,则存在路径vi,v1,vj / 路径中所含顶点序号不大于1若vi,v2, v2,vj存在, 则存在一条路径vi, , v2, vj / 路径中所含顶点序号不大于2 依次类推,则 vi 至 vj 的最短路径应是上述这些路径中,路径长度最小者。如图(B) a b c a 0 4 11 b 6 0 2c 3 0 图(B

7、)实现任意两点之间的最短路径的计算和显示可采用两种实验方法:1. 先采用弗洛伊德算法计算出图中所有结点之间的最短路径,将最短路径权值和最短路径路径分别存入相应的数组中,然后用户输入所要查询的两点序号,直接便可查询出最短路径权值和最短路径。2. 由迪杰斯特拉算法的思想,将所输入的节点“V1” “V2”中任意一点作为源点,运行迪杰斯特拉算法,当求出“v1”“v2”之间的最短路径之后就终止程序的运行。(只用加入一个条件判断语句就可实现) 程序如下因为第一种算法需要求出所有点之间的最短路径,所以执行效率较低,我采用第二种算法.四. 算法实现(程序)#include const int max=3672

8、7;/创建图类 public class G int vexNum; /图中的节点总数 int arcsvexNum; /图的带权邻接矩阵 int distvexNum; /图的最短路径权值矩阵 int pathvexNum; /用于记录最短路径的前驱顶点 public G() /构造函数 vexNum=0; void initiateArcs(int vex) /带权邻接矩阵初始化 vexNum= vex; for(int j=0; jvexNum; +j) for(int k=0; kvexNum; +k) cin arcsjk; void Shortpath(int v1,int v2

9、) /求任意两点之间的最短路径 /pathv为从v0到v的最短路径的前驱顶点, /distv为其当前的最短距离.s为全局变量,sv=1, /表示v已在S集合中,即已求得从v0到v的最短距离。 for (v=0; vvexnum; +v) sv=0; distv=arcsv1v; if (distvinfinity) pathv=v0; /v0是v的前驱 else pathv=-1; /v无前驱 distv1=0; sv1=1; /S集中开始时只有v0 for (i=1; ivexnum; +i) int min=max; for (int w=0; wvexnum; +w) if (sw=0)

10、 /wV-S if(distw min) v=w; min=distw; sv=1; /将v加入S for(w=0;w vexnum; +w) /调整其余在V-S的点 if(sw = 0 & (distv + arcsvw distw) distw= distv + arcsvw; pathw=v; if(v = v2) break; void printpath(int v1,int v2) /打印路径 cout pathv2 -; /运用第归 if (v1 != pathv2) printpath(v1,pathv2); void printResult ( int v1,int v2)

11、cout The shortest path between v v1 and v v2 is:; printpath(v1,v2); cout The value of the shortest path is:; cout distv1v2 endl; main() /主函数 G graph(); int v1,v2; /用户输入任意两点 int vexNum; cout Input vexNumber :; /输入图节点总数 cin vexNum; graph.initiateArcs(vexNum); /输入图的带权邻接矩阵 cout Input two vexes:; /输入任意两个节点 cin v1 v2; graph.shortPath(v1,v2); /求出V1、V2之间的最短路径 graph.printResult(v1,v2); /打印输出结果 return 1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1