HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )
**链接:****传送门 **
题意:有 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 + 记录路径 )的更多相关文章
- hdu 1385 Minimum Transport Cost (Floyd)
Minimum Transport CostTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu 1385 Minimum Transport Cost(floyd && 记录路径)
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- HDU 1385 Minimum Transport Cost (Dijstra 最短路)
Minimum Transport Cost http://acm.hdu.edu.cn/showproblem.php?pid=1385 Problem Description These are ...
- hdu 1385 Minimum Transport Cost (floyd算法)
貌似···················· 这个算法深的东西还是很不熟悉!继续学习!!!! ++++++++++++++++++++++++++++ ======================== ...
- HDU 1385 Minimum Transport Cost (最短路,并输出路径)
题意:给你n个城市,一些城市之间会有一些道路,有边权.并且每个城市都会有一些费用. 然后你一些起点和终点,问你从起点到终点最少需要多少路途. 除了起点和终点,最短路的图中的每个城市的费用都要加上. 思 ...
- HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】
<题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...
- hdu 1385 Minimum Transport Cost
http://acm.hdu.edu.cn/showproblem.php?pid=1385 #include <cstdio> #include <cstring> #inc ...
- HDU 1385 Minimum Transport Cost 最短路径题解
本题就是使用Floyd算法求全部路径的最短路径,并且须要保存路径,并且更进一步须要依照字典顺序输出结果. 还是有一定难度的. Floyd有一种非常巧妙的记录数据的方法,大多都是使用这种方法记录数据的. ...
- Minimum Transport Cost(floyd+二维数组记录路径)
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
随机推荐
- 1010针对一个binlog日志的分析
针对一个BINLOG日志的分析 -- 当前binlog_format | ROW[root@109 mysql]# cat wang1010.txt/*!50530 SET @@SESSION.PSE ...
- AOJ 0121 Seven Puzzle {广度优先搜索}(*)
原题 题意 题意是有一个输入,比方: 1 0 2 3 4 5 6 7 摆成例如以下形状: 1 0 2 3 4 5 6 7 0表示空格.其它数字能够移动到0的位置.最后须要到例如以下形状: 0 1 2 ...
- HDU 5291(Candy Distribution-差值dp)
Candy Distribution Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- Spring+EhCache缓存实例(具体解说+源代码下载)
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- 【Python学习笔记】-APP图标显示未读消息数目
以小米手机系统为例,当安装的某个APP有未读消息时,就会在该APP图标的右上角显示未读消息的数目.本文主要解说怎样用Python语言实现图标显示未读消息的数目.首先,还是要用到Python中PIL库, ...
- CodeForces 596A
Description After making bad dives into swimming pools, Wilbur wants to build a swimming pool in the ...
- Linux查找并杀死僵尸进程
1.查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程. 2.定位僵尸进程 使用命令ps -A -ostat,ppid,pid,cmd |gre ...
- HBase编程 API入门系列之HTable pool(6)
HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了“池”的概念. 引入“HBase里的连接池”的目的是: 为了更高的,提高程序的并发 ...
- html中map标签和area标签的应用
map标签的用途:是与img标签绑定使用的,常被用来赋予给客户端图像某处区域特殊的含义,点击该区域可跳转到新的文档. 因为map标签是与img标签绑定使用的,所以我们需要给map标签添加ID和name ...
- let,const,var三者之间的区别
在ES6中新增了两种定义变量的命令let和const,在这之前相信大家都对var定义变量很熟悉,那么在了解ES6方法前, 1.我们先来回顾一下var定义变量的方法. 下面来看这段代码: for (va ...