从娃娃就开始学起最短路,我居然不会作!!算法
主要算法就三种(我只会三种): \(Floyd\),\(Dijkstra\),和已经死了的 \(SPFA\)数组
(其实 \(SPFA\) 有许多优化方式均可以卡掉,会在下一章里讲,这里就不赘述)优化
洛谷中有这么一道题P6175 无向图的最小环问题和例题差很少spa
发现 \(n\) 的范围很小,考虑用 \(Floyd\)。ip
由于 \(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\) 了get
Codeclass