http://poj.org/problem?id=1734
比着别人的代码写的 自己对floyd的理解还是不深刻呀
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<set> #include<queue> #include<stack> #include<cmath> #define LL long long using namespace std; const int N=105; const int INF=0x0f3f3f3f; int d[N][N]; int dist[N][N]; int f[N][N]; int path[N]; int main() { //freopen("data.txt","r",stdin); int n,m; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { d[i][j]=dist[i][j]=INF; f[i][j]=i; } while(m--) { int i,j,x; scanf("%d %d %d",&i,&j,&x); d[i][j]=d[j][i]=dist[i][j]=dist[j][i]=min(d[i][j],x); } int MIN=INF; int I; for(int l=1;l<=n;++l) { for(int i=1;i<l;++i)//l 也可以换成n 还是不理解呀 { for(int j=i+1;j<l;++j)//l 也可以换成n 还是不理解呀 { int temp=dist[i][j]+d[i][l]+d[l][j]; if(temp<MIN) { MIN=temp; I=0; int k=j; do{ path[I++]=k; k=f[i][k]; }while(k!=i); path[I++]=i; path[I++]=l; } } } for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(dist[i][l]+dist[l][j]<dist[i][j]) { dist[i][j]=dist[i][l]+dist[l][j]; f[i][j]=f[l][j]; } } } } if(MIN==INF) { printf("No solution.\n"); continue; } for(int i=0;i<I;++i) { if(i) printf(" "); printf("%d",path[i]); } printf("\n"); } return 0; }