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

上传人:文库蛋蛋多 文档编号:2396879 上传时间:2023-02-17 格式:DOC 页数:10 大小:78.50KB
返回 下载 相关 举报
有向图中任意令两点之间的最短路径.doc_第1页
第1页 / 共10页
有向图中任意令两点之间的最短路径.doc_第2页
第2页 / 共10页
有向图中任意令两点之间的最短路径.doc_第3页
第3页 / 共10页
有向图中任意令两点之间的最短路径.doc_第4页
第4页 / 共10页
有向图中任意令两点之间的最短路径.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《有向图中任意令两点之间的最短路径.doc》由会员分享,可在线阅读,更多相关《有向图中任意令两点之间的最短路径.doc(10页珍藏版)》请在三一办公上搜索。

1、有向图中任意两点之间的最短路径一. 问题求出有向图中任意两点之间的最短路径并打印结果二. 语言环境C+三. 问题分析要解决有向图中任意两点之间的最短路径问题首先应解决的问题是1. 从源点到其余各点的最短路径问题2. 每一对定点之间的最短路径问题对于”从源点到其余各点的最短路径问题” 有经典算法-“迪杰斯特拉算法”.该算法的思想是: (1). 如图(A)132113长度最短路径81920164320 图(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(

5、w=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; v3v4v1v2v0v550 10 30 100 5 50 10 20 60 步骤第一步第二步第三步第四步第五步v1无v210(v0,v2)v360(v0,v2,v3)50(v0,v4,v3)v430(v0,v4)30(v0,v4)v5100(v0,v

6、5)100(v0,v5)90(v0,v4,v5)60(v0,v4,v3,v5)vjv2v4v3v5Sv0,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 的最短路径应是上述这些路径中,路径长度最

7、小者。cV316V10v223114abcV316V10v223114ab如图(B) a b ca0 4 11 b 6 0 2c 3 0 图(B )实现任意两点之间的最短路径的计算和显示可采用两种实验方法:1. 先采用弗洛伊德算法计算出图中所有结点之间的最短路径,将最短路径权值和最短路径路径分别存入相应的数组中,然后用户输入所要查询的两点序号,直接便可查询出最短路径权值和最短路径。2. 由迪杰斯特拉算法的思想,将所输入的节点“V1” “V2”中任意一点作为源点,运行迪杰斯特拉算法,当求出“v1”“v2”之间的最短路径之后就终止程序的运行。(只用加入一个条件判断语句就可实现) 程序如下因为第一种

8、算法需要求出所有点之间的最短路径,所以执行效率较低,我采用第二种算法.四. 算法实现(程序)#include const int max=36727;/创建图类 public class Gint 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

9、k=0; kvexNum; +k)cin arcsjk;void Shortpath(int v1,int v2 ) /求任意两点之间的最短路径/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集中开始时只有v0for (i=1; ivexnum; +i)

10、 int min=max;for (int w=0; wvexnum; +w)if (sw=0) /wV-Sif(distw min) v=w; min=distw; sv=1; /将v加入Sfor(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,path

11、v2);void printResult ( int v1,int v2)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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号