见注释:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m,cnt;
int g[N][N],d[N][N];
int pos[N][N];
int path[N];
void get_path(int i,int j)//递归找经过的点
{
if(pos[i][j] == 0)
return ;
int k = pos[i][j];
get_path(i,k);
path[cnt ++ ] = k;
get_path(k,j);
}
int main()
{
cin>>n>>m;
memset(g,0x3f,sizeof(g));
for(int i = 1; i <= n; i ++ )
g[i][i] = 0;
while(m -- )
{
int a,b,c;
cin>>a>>b>>c;
g[a][b] = g[b][a] = min(c,g[a][b]);
}
memcpy(d,g,sizeof(g));
int res = 0x3f3f3f3f;
for(int k = 1; k <= n; k ++ )
{
for(int i = 1; i < k; i ++ )
for(int j = i + 1; j < k; j ++ )
{
if(res > (long long) d[i][j] + g[i][k] + g[k][j])//d表示已经更新了k - 1个点的最短长度,
//g表示原图的长度
{
cnt = 0;
res = d[i][j] + g[i][k] + g[k][j];//用一个 i -> k -> j -> i的环来模拟一下就好理解很多
path[cnt ++ ] = k;
path[cnt ++ ] = i;
get_path(i,j);
path[cnt ++ ] = j;
}
}
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= n; j ++ )
{
if(d[i][j] > d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
pos[i][j] = k;//第k轮i到j经过的点
}
}
}
if(res == 0x3f3f3f3f)
cout<<"No solution.";
else
{
for(int i = 0; i < cnt; i ++ )
cout<<path[i]<<" ";
}
return 0;
}