**链接:****传送门 **

题意:有 n 个城市,从城市 i 到城市 j 需要话费 Aij ,当穿越城市 i 的时候还需要话费额外的 Bi ( 起点终点两个城市不算穿越 ),给出 n × n 大小的城市关系图,-1 代表两个城市无法连通,询问若干次,求出每次询问的两个城市间的最少花费以及打印出路线图

思路:经典最短路打印路径问题,直接使用一个二维数组 path[i][j] 记录由点 i 到点 j 最短路的最后后继点,这道题关键是当松弛操作相等时,i 到 j 的最短距离是可以由 k 进行跳转的,这时候需要判断这两条路径哪个字典序更小,也就是比较这两条路的直接后继节点的大小( path[i][j] ? path[i][k] ),并更新最小字典序路径。


/*************************************************************************
> File Name: hdu1385t2.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月14日 星期三 16时56分08秒
************************************************************************/ #include<bits/stdc++.h>
using namespace std; const int MAX_N = 2010;
const int INF = 1e9;
int c[MAX_N] , dis[MAX_N][MAX_N] , path[MAX_N][MAX_N]; // path[i][j] 代表i到j这条最短路中的直接后继编号
int n , st , ed; void input(){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
scanf("%d",&dis[i][j]);
if( dis[i][j] == -1 ) dis[i][j] = INF;
}
}
for(int i = 0 ; i < n ; i++) scanf("%d",&c[i]);
} void floyd(){
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++) path[i][j] = j;
for(int k = 0 ; k < n ; k++){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if( dis[i][j] > dis[i][k] + dis[k][j] + c[k] ){
dis[i][j] = dis[i][k] + dis[k][j] + c[k];
path[i][j] = path[i][k];
}
else if( dis[i][j] == dis[i][k] + dis[k][j] + c[k] ){
if( path[i][j] > path[i][k] ){
path[i][j] = path[i][k];
}
}
}
}
}
} vector<int> get_path(int st,int ed){
int t = st;
vector<int> ret;
for( ; t != ed ; t = path[t][ed] ) ret.push_back(t);
ret.push_back(ed);
return ret;
}
int main(){
while(~scanf("%d",&n) && n){
input();
floyd();
bool first = true;
while(true){
if( !first ) puts("");
first = false;
scanf("%d%d",&st,&ed);
if( st == -1 && ed == -1 ) break;
if( st == ed ){
printf("From %d to %d :\nPath: ",st,ed);
printf("%d\n",st);
printf("Total cost : 0\n");
}else {
printf("From %d to %d :\nPath: ",st--,ed--);
vector<int> ans = get_path(st,ed);
for(int i = 0 ; i < ans.size()-1 ; i++) printf("%d-->",ans[i]+1);
printf("%d\nTotal cost : %d\n",ans[ans.size()-1]+1 , dis[st][ed]);
}
}
}
return 0;
}

HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )的更多相关文章

  1. hdu 1385 Minimum Transport Cost (Floyd)

    Minimum Transport CostTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  2. hdu 1385 Minimum Transport Cost(floyd &amp;&amp; 记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  3. HDU 1385 Minimum Transport Cost (Dijstra 最短路)

    Minimum Transport Cost http://acm.hdu.edu.cn/showproblem.php?pid=1385 Problem Description These are ...

  4. hdu 1385 Minimum Transport Cost (floyd算法)

    貌似···················· 这个算法深的东西还是很不熟悉!继续学习!!!! ++++++++++++++++++++++++++++ ======================== ...

  5. HDU 1385 Minimum Transport Cost (最短路,并输出路径)

    题意:给你n个城市,一些城市之间会有一些道路,有边权.并且每个城市都会有一些费用. 然后你一些起点和终点,问你从起点到终点最少需要多少路途. 除了起点和终点,最短路的图中的每个城市的费用都要加上. 思 ...

  6. HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】

    <题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...

  7. hdu 1385 Minimum Transport Cost

    http://acm.hdu.edu.cn/showproblem.php?pid=1385 #include <cstdio> #include <cstring> #inc ...

  8. HDU 1385 Minimum Transport Cost 最短路径题解

    本题就是使用Floyd算法求全部路径的最短路径,并且须要保存路径,并且更进一步须要依照字典顺序输出结果. 还是有一定难度的. Floyd有一种非常巧妙的记录数据的方法,大多都是使用这种方法记录数据的. ...

  9. Minimum Transport Cost(floyd+二维数组记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

随机推荐

  1. Ubuntu下ss的安装与使用

    不得不说,linux真的有种让人用上就爱上的魔力,正好最近Ubuntu出了16.04,便索性装了个win10+Ubuntu的双系统,也算是告慰那永远留在老硬盘里的虚拟机吧. 言归正传,换上Ubuntu ...

  2. 消息队列Rabbit安装

    先安装elang 再安装Rabbit *Rabbit安装路径不能有空格 安装完成

  3. ReentrantLock公平锁与非公平锁lock()方法去竞争锁的不同点

  4. Python学习-修饰器 - itemgetter的妙用

    下面这篇对装饰器讲的很好,懂了. http://python.jobbole.com/85056/ <简单 12 步理解 Python 装饰器> 使用装饰器非常简单(见步骤10),但是写装 ...

  5. [React Native] Reduce Long Import Statements in React Native with Absolute Imports

    In large React Native projects, it’s common to have long relative import paths like: import MyCompon ...

  6. GET,POST,PUT,DELETE的区别 和 用法

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  7. 坚向的ViewPager,上下滑动的组件,android上下滑动 VerticalPager

    package com.zhulin.android.atools; import android.content.Context; import android.util.AttributeSet; ...

  8. luogu3911 最小公倍数之和

    题目大意 给出一些数\(A_1,A_2,\cdots A_n\),求 \[\sum_{i=1}^{n}\sum_{j=1}^{n}\mathrm{lcm}(A_i,A_j)\] \(A_i,A_n\l ...

  9. jQuery右键菜单contextMenu实例

    URL: http://www.cnblogs.com/whitewolf/archive/2011/09/28/2194795.html http://www.blogjava.net/superc ...

  10. this关键字和super关键字

    一.this Java中为了解决变量的命名冲突和不确定性问题,引入了关键字this.this代表当前类的一个实例,它经常出现在方法和构造方法中,具体使用情况有以下三种: 1,返回调用当前方法的对象的引 ...