【学习笔记】Floyd的妙用

【学习笔记】Floyd的妙用

1.最短路计数

单纯的最短路计数,事实上也能通过\(SPFA\)实现。而求两点之间经过某个点的最短路路径数,实现可以用两次\(SPFA\)。假若时间复杂度允许,亦可用下面介绍的方法,代码较为简单。

P2047 [NOI2007]社交网络

这道题是多源最短路,所以用\(floyd\)实现求最短路。

\(f[i][j]\)\(i\)\(j\)最短路长度,\(s[i][j]\)为最短路径数。对于一点\(k\),如果\(f[i][k]+f[k][j]=f[i][j]\),则经过该点的最短路径条数为\(s[i][k]\times s[k][j]\)

2.经过\(k\)条边

对于诸如求两点之间经过\(k\)条边的最短路长度/路径数的问题,用\(dij/SPFA\)较难实现,这时候可以尝试使用\(floyd\)。下面通过例题介绍。

P2886 [USACO07NOV]牛继电器Cow Relays

在本题中,用\(SPFA\)直接求空间会爆,只能考虑使用\(floyd\)求经过\(1\le K\le k\)条路径的最短路。\(k\)如此大以至于会\(TLE\)。于是我们可以通过倍增解决。

题解

BTW,本题也可以通过矩阵快速幂解决,详情请见info___tion的blog

3.最小环

度度熊保护村庄

\(floyd\)可以求无向图和有向图的最小环。

对于在有向图中,求经过第\(i\)个点的最小环,我们可以把\(f[i][i]= \infin\),跑一遍\(floyd\),则最小环为\(f[i][i]\)

而在无向图中,方法与上面的大致相同,不过要注意:不能重复走同一条边,枚举边即可以解决。

对于上面的例题,我们还需要用叉积判断是否所有点都在边的同一边,再根据实际情况建单向边,详情看大佬题解

4.图的传递闭包

===预留====

总结

\(floyd\)不仅可以求多源最短路,也可以求一些base on最短路的问题。不过由于其时间复杂度较大,需要谨慎使用

猜你喜欢

转载自www.cnblogs.com/fmj123/p/11288430.html
今日推荐