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;
}