有向图中任意令两点之间的最短路径_第1页
有向图中任意令两点之间的最短路径_第2页
有向图中任意令两点之间的最短路径_第3页
有向图中任意令两点之间的最短路径_第4页
有向图中任意令两点之间的最短路径_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、图(A )路径长度最短的最短路径的特点:在这条路径上,必定只含一条弧,并且这条弧的权值最小。 下一条路径长度次短的最短路径的特点:它只可能有两种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经过顶点v1,再到达该顶点(由两条弧组成)。再下一条路径长度次短的最短路径的特点:它可能有三种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是从源点经过顶点v2,再到达该顶点。其余最短路径的特点:它或者是直接从源点到该点(只含一条弧); 或者是从源点经过已求得最短路径的顶点,再到达该顶点。由以上特点可知:假设S为已求得最短路径的终点的集

3、合,则可证明:下一条最短路径(设其终点为x)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达终点x的路径。 假设此路径上有一个顶点不在S中,则说明存在一条终点不在S中,而长度比此路径短的路径。但这是不可能的,因为我们是按路径长度递增的次序来产生最短路径的,故长度比此路径短的所有路径均已产生,他们的终点必定在S中,即假设不成立。设置辅助数组Dist,其中每个分量Distk 表示 当前所求得的从源点到其余各顶点 k 的最短路径。一般情况下,Distk = <源点到顶点 k 的弧上的权值> 或者 = <源点到S中某顶点j的路径长度> + <顶点j到顶点 k 的弧

4、上的权值>。()在所有从原点出发的弧中选取一条权值最小的弧即为第一条最短路径(如图(a )V0和k之间存在弧V0和k之间不存在弧其中的最小值即为最短路径的长度。()修改其它各顶点的Distk值。假设求得最短路径的顶点为u,若 Distu+G.arcsuk<Distk则将 Distk 改为 Distu+G.arcsuk。迪杰斯特拉算法程序段Shortpath(Mgraph G,int v0, int path, int dist)/pathv为从v0到v的最短路径的前驱顶点,/distv为其当前的最短距离.s为全局变量,sv=1,/表示v已在S集合中,即已求得从v0到v的最短距离。

5、For(v=0;v<G.vexnum;+v) sv=0; distv=G.arcsv0v; If(distv<infinity) pathv=v0; /v0是v的前驱 else pathv=-1; /v无前驱 distv0=0; sv0=1; /S集中开始时只有v0 For(i=1;i<G.vexnum;+i) min=infinity; for(w=0;w<G.vexnum;+w) if(sw=0) /wV-S if(distw<min) v=w; min=distw; sv=1; /将v加入S for(w=0;w<G.vexnum;+w) /调整其余在V

6、-S的点 if(sw=0 &&(distv+G.arcsvw<distw) 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,v5)100(v0,v5)90(v0,v4,v5)60(v0,v4,v3,v5)vjv2v4v3v5Sv0,v2v0,v2,v4v0,v2,v4,v3v0,v2,v4,v3,v5对于”

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

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

9、>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; j<vexNum; +j)for(int k=0; k<vexNum; +k)cin << arcsjk;void S

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

11、w=0; w<vexnum; +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 (

12、v1 != pathv2)printpath(v1,pathv2);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;g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论