解题思路:
本题的做法十分简单:直接用floyd算法,但是要把加法改成min,min改成max。为什么可以
这样做呢?不管是floyd算法还是dijkstra算法,都是基于这样一个事实:对于任意一条至少包含两条边的路
径i->j,一定存在一个中间点k,使得i->j的总长度等于i->k与k->j的长度之和。对于不同的点k,i->k和
k->j的长度之和可能不同,最后还需要取一个最小值才是i->j的最短路径。把刚才的推理中“之和”与“取最小值”
换成“取最小值”和“取最大值”,推理仍然适用。这个是白书的经典做法,还有另外一种方法是Kruskal离线的
做法,可以看这个博客:这里
只写了Floyd变形的写法,Kruskal的写法就没写了。
Kruskal的写法:
Floyd算法: