补充:求经过x的最小环
可以求不经过x下x邻接点中任意两点的最短距离,用floyd
O
(
n
3
)
O(n^3)
O(n3)
邻接点最短距离可以改为二进制分组后Dijkstra, O ( ( n + m ) log m log n ) O((n+m)\log m\log n) O((n+m)logmlogn),或者完全图 O ( n 2 log n ) O(n^2\log n) O(n2logn)
更好的方法是求以x为起点跑最短路,记录到u点的最短路径是从x的哪个邻接点出来的(称作出发点),枚举每一条边(u,v,w),如果两个端点的出发点不同,则将dis[u]+dis[v]+w计入答案。显然最小环上一定有这样的边(如果边的其中一端为x则出发点记为x)。复杂度
O
(
(
n
+
m
)
log
m
)
O((n+m)\log m)
O((n+m)logm),完全图
O
(
n
2
)
O(n^2)
O(n2)
或者可以记录x到每个点的最短路和次短路(转移时保证最短路和次短路的出发点不同),那么最短路+次短路的最小值就是答案,其实与上面的方法是等价的,但是由于要求次短路所以会慢一倍多(吧)。