算法总结篇---最短路

写在前面

从娃娃就开始学起最短路,我竟然不会做!!

主要算法就三种(我只会三种): \(Floyd\)\(Dijkstra\),和已经死了的 \(SPFA\)

(其实 \(SPFA\) 有许多优化方式都可以卡掉,会在下一章里讲,这里就不赘述)

例题

Sightseeing Trip

洛谷中有这么一道题P6175 无向图的最小环问题和例题差不多

发现 \(n\) 的范围很小,考虑用 \(Floyd\)

因为 \(Floyd\) 是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点 \(k\),当前的点 \(k\) 肯定不存在于已存在的最短路 \(dis[i][j]\) 的路径上,因为我们还没用这个 \(k\) 去更新最短路,相当于 ($i \to k \to j \to $ j $到 \(i\) 的最短路 \to i$)这样一个环就找到了,接下来我们要记录路径,用 \(path[i][j]\) 表示在最短路i到j的路径上j的前一个结点,所以我们在更新最短路时也要更新这个点,原来的最短路是 \(i -> j\),现在变成了 \(i -> k -> j\),所以有 \(per[i][j] = pre[k][j]\),因为要找最小环,所以不断更新找到环的权值,环更新一次,路径也要更新一次,路径更新时根据 \(pre\) 数组迭代一下就 \(ok\)

Code

posted @ 2021-01-17 21:59  Suzt_ilymtics  阅读(80)  评论(0编辑  收藏  举报