有向图中任意两点之间的最短路径 下载本文

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

一. 问题

求出有向图中任意两点之间的最短路径并打印结果

二. 语言环境

C++

三. 问题分析

要解决有向图中任意两点之间的最短路径问题首先应解决的问题是 1. 从源点到其余各点的最短路径问题 2. 每一对定点之间的最短路径问题

1从源点到其余各点的最短路径问题” 有经典算法-------“迪杰斯特拉对于”○

算法”.该算法的思想是:

(1). 如图(A) 图(A )

路径长度最短的最短路径的特点:

0 2 3 4 1 6 最短路径 长度 13 8 13 19 21 20 在这条路径上,必定只含一条弧,并且这条弧的权值最小。 下一条路径长度次短的最短路径的特点:

它只可能有两种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经过顶点v1,再到达该顶点(由两条弧组成)。 再下一条路径长度次短的最短路径的特点:

它可能有三种情况:或者是直接从源点到该点(只含一条弧); 或者是从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是从源点经过顶点v2,再到达该顶点。 其余最短路径的特点:

它或者是直接从源点到该点(只含一条弧); 或者是从源点经过已求得最短路径的顶点,再到达该顶点。

由以上特点可知:

假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为x)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达终点x的路径。

假设此路径上有一个顶点不在S中,则说明存在一条终点不在S中,而长度比此路径短的路径。但这是不可能的,因为我们是按路径长度递增的次序来产生最短路径的,故长度比此路径短的所有路径均已产生,他们的终点必定在S中,即假设不成立。

设置辅助数组Dist,其中每个分量Dist[k] 表示 当前所求得的从源点到其余各顶点 k 的最短路径。 一般情况下,

Dist[k] = <源点到顶点 k 的弧上的权值> 或者 = <源点到S中某顶点j的路径长度>

+ <顶点j到顶点 k 的弧上的权值>。

(1). 在所有从原点出发的弧中选取一条权值最小的弧即为第一条最短路径(如图(a ))

Dist[k]???G.arcs[v0][k]和k之间存在弧 ?INFINITYV0 V0和k之间不存在弧

其中的最小值即为最短路径的长度。

(2). 修改其它各顶点的Dist[k]值。假设求得最短路径的顶点为u,Dist[u]+G.arcs[u][k]

迪杰斯特拉算法程序段

Shortpath(Mgraph G,int v0, int path[], int dist[]) //path[v]为从v0到v的最短路径的前驱顶点, //dist[v]为其当前的最短距离.s为全局变量,s[v]=1,

//表示v已在S集合中,即已求得从v0到v的最短距离。

{ For(v=0;v

{ s[v]=0; dist[v]=G.arcs[v0][v];

If(dist[v]

dist[v0]=0; s[v0]=1; //S集中开始时只有v0 { For(i=1;i

{ min=infinity;

for(w=0;w

if(dist[w]

s[v]=1; //将v加入S

for(w=0;w