写在前面
从娃娃就开始学起最短路,我竟然不会做!!
主要算法就三种(我只会三种): (Floyd),(Dijkstra),和已经死了的 (SPFA)
(其实 (SPFA) 有许多优化方式都可以卡掉,会在下一章里讲,这里就不赘述)
例题
Sightseeing Trip
洛谷中有这么一道题P6175 无向图的最小环问题和例题差不多
发现 (n) 的范围很小,考虑用 (Floyd)。
因为 (Floyd) 是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点 (k),当前的点 (k) 肯定不存在于已存在的最短路 (dis[i][j]) 的路径上,因为我们还没用这个 (k) 去更新最短路,相当于 ($i o k o j o $ j $到 (i) 的最短路 o i$)这样一个环就找到了,接下来我们要记录路径,用 (path[i][j]) 表示在最短路i到j的路径上j的前一个结点,所以我们在更新最短路时也要更新这个点,原来的最短路是 (i -> j),现在变成了 (i -> k -> j),所以有 (per[i][j] = pre[k][j]),因为要找最小环,所以不断更新找到环的权值,环更新一次,路径也要更新一次,路径更新时根据 (pre) 数组迭代一下就 (ok) 了