题目
给定一张无向图,求图中一个至少包含 3 3 3个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题。在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。若无解,输出 No solution.
图的节点数不超过 100 100 100 。
- 输入格式
第一行两个正整数 n , m n,m n,m表示点数和边数。
接下来 m m m行,每行三个正整数 x , y , z x, y, z x,y,z,表示节点 x , y x, y x,y之间有一条长度为 z z z的边。 - 输出格式
输出一个最小环的方案:按环上顺序输出最小环上的点。若最小环不唯一,输出任意一个均可。若无解,输出 No solution.
样例输入
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
样例输出
1 3 5 2
题解:
1.求环
这道题不是特别难,感觉就像是模拟题升高“亿点点”。首先我们要知道如何求出环状最短路,最简单的我们可以想到将一个最短路先算出来,左右端点为i,j,再枚举一个k点,连接起来就是一个环,但问题就在于i,j枚举范围,如果k在i,j中间,那么就会出现i --> k --> j,从而连起来不是一个环而是一条通路,所以我们不难想到第一重阶段枚举k在(1——n)的取值,而后两重循环枚举i, j(1——k - 1),这样即可使k一定不在i,j之间,所以联通出来一定是个环。最后再来一个循环枚举i——j的经k点最短路,为下一次求环做输出路径和最短路做基础。
for (int k = 1;k <= n; k++) {
for (int i = 1; i < k; i++) {
for (int j = i + 1; j < k; j++) {
if((long long)fd[i]