您的位置:首页 > 其它

HDU1385 Minimum Transport Cost

2014-03-03 19:59 232 查看
                                                               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
,a

,mp

; //记录从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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: