图的问题,核心是解决3种情况
1.有若干小镇,小镇之间有的有路,有的没路。现在我想修路,使小镇之间互相连通(A和B之间可能没有路,但A通过C可以到B),请问我现在至少要修几条路?
解决方案:
首先要有一个概念,当一群小镇互相连通时,我们说,这是一个“连通块”。尝试遍历所有小镇,由于连通快个数一定大于1,那么有n个连通快,就说明遍历中断n-1次,就修n-1条路。
2.我要和可爱迷人善良温柔的女朋友要从杭州去南京旅游。女朋友说“我们走最短的路径到南京吧”。但地图上只标注了城市的两两距离(A到B,B到C,C到A的形式)。请问怎么求杭州到南京的最短路径呢?
解决方案:
中介点概念:假设已知A到B的距离为d1。现在发现A到C,C到B的距离为d2,而且d2<d1。那么目前C就是中介点,A到C,C到B的距离之和就是目前A到B的最短距离。假设A到C的距离为d3,然后我们又发现,A到D,D到C的距离d4<d3,那么D就成为A到C的中介点,经过C,D的路线距离就是目前A到B的最短距离。你应该想到了,所谓的中介点其实就是前驱点,当前驱点越来越多,直至与A重合时,A到B的最短路径(包括距离,途经的点)就形成了。记录下前驱点,我们的路线也就确定了。
很容易想到一个问题,一个点的前驱点是固定的吗?回答是no.一个点的前驱点有可能发生变化,但一定是以下这种情况:
那么有没有可能发生前驱点被“替换”的情况呢?即:
这种情况是不可能的,因为:
具体算法(Dijsktra)