六、标号法
标号法是一种非常直观的求最短路径的算法,单从分析过程来看,我们可以用一个
数轴简单地表示这种算法:
1、 以A点为0点,展开与其相邻的点,并在数轴中标出。
2、因为C点离起点A最近,因此可以断定C点一定是由A直接到C点这条路径是最短的
(因为A、C两点间没有其它的点,所以C点可以确定是由A点直接到达为最短路径)。因
而就可以以已经确定的C点为当前展开点,展开与C点想连的所有点A'、B'、D'、E'。
3、由数轴可见,A与A'点相比,A点离原点近,因而保留A点,删除A'点,相应的,
B、B'点保留B点,D、D'保留D',E、E'保留E',得到下图:
4、此时再以离原点最近的未展开的点B联接的所有点,处理后,再展开离原点离近
未展开的D点,处理后得到如下图的最终结果:
5、由上图可以得出结论:点C、B、D、E就是点A到它们的最短路径(注意:这些路
径并不是经过了所有点,而是只经过了其中的若干个点,而且到每一个点的那条路径不
一定相同)。因而A到E的最短距离就是13。至于它经过了哪几个点大家可在上述过程中
加以记录即可。
上述就是解最短路径问题的常用方法,但对于实际的题目到底用哪种方法?用该方
法是不是需要做些变动?这种能力往往是很多同学所欠缺的,这只能靠平常地多学多练 多总结才能把自己的能力与成绩挂上钩。下面我们就再看一个例题。
例3、Internet消息发布
问题描述:设Internet上有N个站点,通常从一个站点发送消息给其他N-1个站点,
需依次发送N-1次。这样从一个站点发布消息传遍N个站点时,可能要较长时间。而当一
个站点发布消息给另一个站点后,已获得消息的这两个站点就可以同时发布消息给另外
两个站点,此后就有四个站点可以同时发布消息,这种发布消息方法应该会缩短消息传
遍N个站点的时间。
请您编一个程序,设从每一个站点都可以向其他N-1个站点同时发送消息,编程求
出从第一个站点开始发布消息传遍N个站点的最短时间。
输入:由文件Input4.dat输入数据,文件的第一行是Internet上的站点数N(1<=N<
=100),第二行起是邻接矩阵严格的下三角部分,各行是整数或字符X。A(I, J)表示从
I站点发送消息给J站点所需要的时间。假设网络是无方向的,故A(I, J)=A(J, I),当
A(I, J)=X时,表示从站点I不能直接向站点J发送消息;A(I, I)=0表示没有必要自己
给自己送消息(1<=I<=N),严格的下三角阵表示如下:
A(2, 1)
A(3, 1), A(3, 2)
A(4, 1), A(4, 2), A(4, 3)
┇
A(N, 1), A(N, 2)……A(N, N-1)
每一测试点一个输入文件,Input4.001、Input4.002、……。
输出:从屏幕上输出,输出只有一行,它是一个非负整数,若为0表示无解,非0表
示合符题意的最小整数。
输入样例: 输出样例:
5 35
50
30 5
100 20 50
10 x x 10
分析:该题同样是一个求图中的最短路径题,但又去例1、例2有很大不同,本题并
不是求某点到某点的最短路径,也不是求走完所有点的最短路径,而是由一点出发产生
多条路径,各条路径又继续出发,直到所有结点都被到达,也就是说:该题的路径有多
条,只是让你求出完成任务后几条路径中最长的那条的耗时。(本题虽不是求最短路径
,但也可归类为最短路径问题)。
先以输入样例为例得到邻接矩阵:
const dis:array[1..5,1..5] of integer=( ( 0,50,30,100,10),
( 50, 0, 5, 20, 0),
( 30, 5, 0, 50, 0),
(100,20,50, 0,10),
( 10, 0, 0, 10, 0))
以下是几种解法:
1、动态规划:
考虑到动态规划可以求出每一个点到起点的最短时间,而我们所需要的答案就是这
些最短时间中最长的那个(为什么?)。而至于此题展开了多少条路径,每个点怎么走
到的我们都不用管了。
2、标号法:
使用标号法,处理完毕后,数轴中距离原点最远的一点就是答案(因为点1到该点所
花的时间是点1到所有点的距离中最长的,因而它的时间就是题目要求的答案)。此题当
然也不是由一条路径走遍所有点,而是几条路径同时走,只不过有长有短,而答案就是
最长的那一条。 |