看了别人的代码才写出来的…… 这里修改了floyd算法。 floyd算的最外层循环,循环k层结束时,dis[i][j]表示i 到 j 的最短距离,之间的点序号不大于 k 。 #include<iostream> #include<string> using namespace std; const int maxn=1000; int n; int count=0; int ans=123456789; int dis[maxn][maxn]; int g[maxn][maxn]; int pre[maxn][maxn]; int road[maxn]; void init() { ans=123456789; for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { dis[i][j]=g[i][j]=123456789; pre[i][j]=j; } } } void floyd() { for (int k=1;k<=n;k++) { for (int i=1;i<k;i++) { for (int j=1;j<i;j++) { int temp; if ((temp=dis[i][j]+g[i][k]+g[j][k])<ans) { ans=temp; int p=i; count=0; road[++count]=i; while (p!=j) { road[++count]=pre[p][j]; p=pre[p][j]; } road[++count]=k; } } } for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { if (dis[i][k]+dis[k][j]<dis[i][j]) { dis[i][j]=dis[i][k]+dis[k][j]; pre[i][j]=pre[i][k]; } } } } } int main() { //freopen("in.txt","r",stdin); while (cin>>n,n!=-1) { init(); int m; int x,y,z; cin>>m; while (m--) { cin>>x>>y>>z; if (z<g[x][y]) { g[x][y]=g[y][x]=z; dis[x][y]=dis[y][x]=z; } } floyd(); if (ans==123456789) { cout<<"No solution."<<endl; } else { for (int i=1;i<=count;i++) { if(1==i) cout<<road[i]; else cout<<" "<<road[i]; } cout<<endl; } } return 0; }