Minimum Transport Cost
题目链接:Clicke Here~
一道好题,可惜晚上没状态,眼睛痛。T_T所以,就没去想要怎么记录最短路的字典序了。直接看了别人的博客。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int INF = 999999; const int N = 100+5; int n,s,e,tax[N],a[N][N],mp[N][N]; //记录从i到j的最小字典序 void Floyd() { for(int i = 1;i <= n;++i) for(int j = 1;j <= n;++j) mp[i][j] = j; for(int k = 1;k <= n;++k) for(int i = 1;i <= n;++i) for(int j = 1;j <= n;++j){ int dist = a[i][k]+a[k][j]+tax[k]; if(dist < a[i][j]){ a[i][j] = dist; mp[i][j] = mp[i][k]; } if(a[i][j] == dist&&mp[i][j]>mp[i][k]) //更新最小字典序 mp[i][j] = mp[i][k]; } } int main() { while(scanf("%d",&n),n) { int x; for(int i = 1;i <= n;++i){ for(int j = 1;j <= n;++j){ scanf("%d",&x); a[i][j] = (x==-1?INF:x); } } for(int i = 1;i <= n;++i) scanf("%d",&tax[i]); Floyd(); while(scanf("%d%d",&s,&e),(s!=-1&&e!=-1)) { printf("From %d to %d :\n",s,e); printf("Path: %d",s); int t = s; while(t!=e) { printf("-->%d",mp[t][e]); t = mp[t][e]; } printf("\n"); printf("Total cost : %d\n\n",a[s][e]); } } return 0; }
HDU1385 Minimum Transport Cost,布布扣,bubuko.com
HDU1385 Minimum Transport Cost
原文:http://blog.csdn.net/zhongshijunacm/article/details/20394241