算法总结篇---最短路
写在前面
从娃娃就开始学起最短路,我竟然不会做!!
主要算法就三种(我只会三种): \(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\) 了