- 观光之旅
给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。
该问题称为无向图的最小环问题。
你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。
输入格式
第一行包含两个整数 N 和 M,表示无向图有 N 个点,M 条边。
接下来 M 行,每行包含三个整数 u,v,l,表示点 u 和点 v 之间有一条边,边长为 l。
输出格式
输出占一行,包含最小环的所有节点(按顺序输出),如果不存在则输出 No solution.。
数据范围
1≤N≤100,
1≤M≤10000,
1≤l<500
输入样例:
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
思路分析:考虑Floyd算法的过程。当外层循环的k刚开始时,d[i,j]的意义为从起点i,只经过1-k,到达j的最短路径,得到最终的动态规划表达式d[k,i,j]=min(d[k,i,j],d[k-1,i,k]+d[k-1,k,j]),我们通过分析可以得出可以把第一维省去,得到Floyd最短路的表达式为d[i,j]=min(d[i,j],d[i,k]+d[k,j]),我们可以这样来求解最小环,以在一个最小环中最大的点为k,构成至少为三点i,j,k的最小环,于是我们可以枚举k求得最小环的长度之和最小值,由于在这个题中我们需要记录最小环的方案,所以我们可以用一个二维数组来记录每次转移的点k,最后递推回去得到方案,而在枚举时由于是无向图,所以我们只需要枚举一半即可,无向图是对称的
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110,INF=0x3f3f3f3f;
int n,m;
int g[N][N],d[N][N],path[N];//用path记录方案
int cnt,pos[N][N];//用pos记录每次转移的k值
void