HDU1385 Minimum Transport Cost

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



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值