题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=110,inf=0x3f3f3f3f; int n,m,map[maxn][maxn],pre[maxn][maxn],dis[maxn][maxn]; void floyd(){ //time O(n^3) space O(n^2) int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ dis[i][j]=map[i][j]; //实际可以直接在map上松弛。更简单 pre[i][j]=i; } } for(k=0;k<n;k++){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); //这和矩阵乘法的动态思想一致 pre[i][j]=pre[k][j]; } } } } int main() { //freopen("cin.txt","r",stdin); int i,j,a,b,c; while(cin>>n>>m&&(n+m)){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ map[i][j]=(i==j?0:inf); } } for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],c); } floyd(); printf("%d\n",dis[0][n-1]); } return 0; }