题意:给你一个无向图(邻接矩阵),求每个点所在的最小环的长度,不存在输出-1。
思路:不是很难想到,包含点s的最小环,应该是s到其余点的最短路的边加上一条不是最短路的边,因为单纯靠最短路并不会形成环。这样的话我们先构造出以s为根,以s到其余点的最短路为边的生成树。然后我们去枚举这样的两个点。无非就两种情况:
1.额外边的一个端点包含点s的情况。
2.额外边的两个端点都不包含s的情况。
红色代表第一种情况,黄色代表第二种。可以看到第二种情况不能在同一棵子树中。用并查集维护一下就好了。
那么步骤就是:
1.枚举每个起始点s。
2.求出s到其余点的最短路,构造生成树。
3.枚举s到其余点j的各条边,此时环的长度 = dis[j]+tu[i][j]。
4.枚举s任意两棵子树上的两个点j,k的边,此时环的长度 = dis[j] + dis[k] + tu[j][k]。
#include <iostream>
#include <cstdio>