大体意思:找一个无向图的最小环并输出路径
floyd找最小环
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 300;
const int inf = 1<<29;
int n,m;
int a[maxn][maxn],p[maxn][maxn],f[maxn][maxn],head[maxn],tot = 0;
int u1,v1;
int ans = inf;
void floyd() {
for(int k = 1; k <= n; k++) {
for(int i = 1; i < k; i++) {
for(int j = i + 1; j < k;j++) {
if(f[i][j] + a[i][k] + a[k][j] < ans) {
ans = f[i][j] + a[i][k] + a[k][j];
tot = 0;
int t = i;
while(t != j) {
head[++tot] = t;
t = p[t][j];
}
head[++tot] = t;
head[++tot] = k;
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(f[i][j] > f[i][k] + f[k][j]) {
f[i][j] = f[i][k] + f[k][j];
p[i][j] = p[i][k];
}
}
}
}
}
int main() {
cin>>n>>m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
a[i][j] = inf;
if(i == j) a[i][j] = 0;
f[i][j] = inf;
if(i == j) f[i][j] = 0;
p[i][j] = j;
}
}
for(int i = 1; i <= m; i++) {
int u,v,w;
cin>>u>>v>>w;
if(w < a[u][v]) {
a[u][v] = a[v][u] = w;
f[v][u] = f[u][v] = w;
}
}
floyd();
if(ans == inf) cout<<"No solution."<<endl;
else {
for(int i = 1; i <= tot; i++) cout<<head[i]<<' ';
}
return 0;
}