#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define INF 9999999999 #define MAXN 305 using namespace std; long long n,m,ans; long long p[305][305],dis[305][305],pos[305][305]; vector<int>q; void get(int x,int y){ if(pos[x][y]==0)return; get(x,pos[x][y]); q.push_back(pos[x][y]); get(pos[x][y],y); } int main(){ while(scanf("%lld%lld",&n,&m)==2){ ans=INF; memset(pos,0,sizeof(pos)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) p[i][j]=dis[i][j]=INF; for(int i=1;i<=m;i++){ long long x,y,z; scanf("%lld%lld%lld",&x,&y,&z); p[x][y]=p[y][x]=min(p[y][x],z); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=p[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(ans>=dis[i][j]+p[i][k]+p[k][j]){ ans=dis[i][j]+p[i][k]+p[k][j]; q.clear(); q.push_back(i); get(i,j); q.push_back(j); q.push_back(k); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(dis[i][j]>dis[i][k]+dis[k][j]){ dis[i][j]=dis[i][k]+dis[k][j]; pos[i][j]=k; } } } } if(ans==INF){ cout<<"No solution."<<endl; continue; } for(int i=0;i<q.size();i++)cout<<q[i]<<' '; cout<<endl; } }
嘛,考虑递归输出 只要记录 中转点 然后就ok了