注意:将inf设置成0x3f3f3f3f后,三个inf相加就爆int了。开始不知道错哪了。。。
有向图可以先拓扑排序
保证形成的环上面至少有三个顶点。
一:dijkstra(有向图无向图都可以)
枚举任意的边,e(i,j),并删去e(i,j)。枚举点i到j的最短路(m次dijkstra),这个时候i到j之间的最短路一定是通过其他边更新出来了。就是说在目前形成的环上面,除了i,j至少还有一个点。 这就保证了最小环上至少有三个顶点。
二:floyed(有向图无向图都可以)
floyed保证了最外层循环到 k 时所有顶点间已求得以 0...k-1 为中间点的最短路径。一个环至少有 3 个顶点,设某环编号最大的顶点为 L ,在环中直接与之相连的两个顶点编号分别为 M 和 N (M,N < L),则最大编号为 L 的最小环长度即为 Graph(M,L) + Graph(N,L) +Dist(M,N) ,其中 Dist(M,N) 表示以 0...L-1 号顶点为中间点时的最短路径,刚好符合 Floyd算法最外层循环到 k=L 时的情况,则此时对 M 和 N 循环所有编号小于 L 的顶点组合即可找到最大编号为 L 的最小环。再经过最外层 k 的循环,即可找到整个图的最小环。
三:最小生成树(无向图)(必须是仙人掌,否则只能dijkstra)
最小的环除了某一条边,其他的一定是在最小生成树上,所以我们我们求出最小生成树,然后枚举每一条边。lca求的两点之间的距离。求出枚举边和两点之间距离和的最大值就行了。