#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=105;
vector<int>path;
int dis[N][N],dist[N][N],pos[N][N];
inline void get_path(int x,int y){
if(!pos[x][y])return;
get_path(x,pos[x][y]);
path.push_back(pos[x][y]);
get_path(pos[x][y],y);
}
int main(){
memset(dis,0x3f,sizeof(dis));
int n=read(),m=read(),ans=1e9;
for(int i=1;i<=m;++i){
int a=read(),b=read(),c=read();
dis[a][b]=dis[b][a]=min(dis[a][b],c);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dist[i][j]=dis[i][j];
for(int k=1;k<=n;++k){
for(int i=1;i<k;++i)
for(int j=i+1;j<k;++j)
if((ll)dist[i][j]+dis[j][k]+dis[k][i]<ans){//不开long long见zz
ans=dist[i][j]+dis[j][k]+dis[k][i];
path.clear();
path.push_back(i);
get_path(i,j);
path.push_back(j);
path.push_back(k);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dist[i][j]>dist[i][k]+dist[k][j]){
dist[i][j]=dist[i][k]+dist[k][j];
pos[i][j]=k;
}
}
if(ans==1e9){
puts("No solution.");
return 0;
}
for(int i=0;i<path.size();++i)printf("%d ",path[i]);
puts("");
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/11559336.html