首先是一句牢骚:为什么国人写书就喜欢各种公式和符号,一定把这本书写的你看了半天都不知道是在说什么他才觉得成功呢?
言归正传:
问题描述:从图中的一个点,怎么找到和其它点距离最短的路径?这是一个很平常的问题,你去任何地方都会希望找到一个距离最短的道路,或者是不堵车(对应到计算机上就可能为延迟最低)的路径。找一个点到另一个点的,和你找一个点对所有点的差不多,因此我在这里只说如果从一个点出发找到达图中其它各点的最短路径。
在讲述方法之前,我解释一下题目中的收费站是怎么回事。收费站是一个立在高速公路出口附近的,征收过路费的机构,它是合法的,利国利民,特别有利于当地政府的财政收入。古人有讲。此山是我开,此树是我栽,要想从这过,留下买路财,不然~~哼哼,管杀不管埋~。因此,在通过收费站的时候,你切记要留给他买路财。
问题的形象化:
假设我这个人经常出差,常去的地方有六个:天津,石家庄,合肥,武汉,南京,上海。我手头现在有一张凝结了千万劳苦大众智慧结晶的地图,这张地图上有着各个高速公路分段计价的标准。如下图:
我现在想找到能够到各个城市,且被收费最低的各条路径。那我应该怎么做呢?
第一步:你得明确,你需要求出六条最短路径,而不是一条。第一条最短路径很好找。与北京直接相连的城市里面,哪一条道征收的过路费最少,哪一条道就是北京到那个城市的最短路径,而且它还是所有最短路径里面开销最低的。
(1)
于是,北京到天津的最短路径就求出来了,而且是所有需要求得最短路径里消费最小的。
第二步:由于从北京出发直接到各个城市的收费已经求出(图(1)),那么我们就再计算下如果途径天津会对这些城市的收费有什么改观,这样好对比是从北京直接出发的开销少,还是从途径天津的少。计算完成后得到下图的结果
(2)
由于石家庄,上海还有南京与天津在图上不是邻接的关系,因此途径天津来说并不是通过一次计算就能完成的,因此他们的值不动,而合肥和武汉和北京之间的开销首次被计算出来,这是通过经过途径天津完成的。这个图里,石家庄的消费最低,这意味着什么?
意味着石家庄的最短路径已经找到。因为走任何一条其它路径到石家庄都比这条路开销大。比如你从天津绕路,那么天津和石家庄不邻接,于是你还得到合肥(28)再找其它能和石家庄邻接的城市,肯定比北京直接到石家庄的15要大。因此北京到石家庄就是15,没有二选。
第三步:北京到天津,石家庄的最短路径已经分别求出,如果途径天津,到其它城市的路径和开销变化也已经求出(图2),那么我们就看看如果途径石家庄,对其它城市的消费有什么影响,同样取途和当前值比小的那个。
(3)
石家庄只和南京邻接,因此他只改变了南京的值。上图中合肥最小,于是北京到合肥的最短路径已经找了出来。理由吗,跟上面一样,你从北京出发绕行上海,武汉,南京都会导致消费比你从北京途径天津再到合肥的收费要高。
从这里聪明的人已经看出来,每一条最短路径都是从北京到图中最小的那个数对应的城市的路径,而相应的城市会在下次运算的时候用来更新与其它城市的消费。
第四步,北京,天津,石家庄,合肥的最短路径出来,天津,石家庄对其它城市的影响也算完了,该算合肥的了。
经过计算影响,发现合肥这地方还是不途径的好。于是上图中,武汉的最短路径求出来了
再计算武汉对其它城市的影响
南京的求出来了
最后是上海(50),途径南京。
这样,各个城市的最短路径全都响应求出。
总结:
1.用一个向量,存着各个结点到出发点的路径长途以及沿途路径。
2..从这向量里面跳出来一个最小的分量,该分量对量的结点以及该分量对应的路径就是该结点到出发点的最短路径
3. 比较向量各个分量的原始值和途径(2)里找出来的那个点的新值,使用最小的那个,并且把路径更新为最小的那个。
4. 在找出来一个最小的
5. 再计算和比较直到把所有的路径都找到。