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 ...
随机推荐
- MySQL 索引分析
MySQL复合唯一索引分析 关于复合唯一索引(unique key 或 unique index),网上搜索不少人说:"这种索引起到的关键作用是约束,查询时性能上没有得到提高或者查询时根本没 ...
- C#--委托的同步,异步,回调函数
原文地址 同步调用 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. using System; using System. ...
- Java经典线程同步问题------生产者与消费者
先上代码 class Test { public static void main(String []args) { Queue q=new Queue(); Producer p=new Produ ...
- HDU 4530
今天让人看不起了,话说好伤心,说我搞了ACM那么久都没获得拿得出手的奖.... 今晚爷爷我要狂刷2013腾讯马拉松的水题,奶奶滴,哈哈哈哈...T_T #include <iostream> ...
- Ruby的case语句
Ruby的case语句 case语句使用的是===判断方式,可以进行更加广义的相等判断: 可以进行类型的判断,可以进行正则表达式的判断: array = ["a",1,nil] a ...
- JavaScript特效之前进,后退(返回上一级)
在页面上增加前进,后退(返回上一级)功能: 方式一:使用函数 <script> function goback(){ history.go(-1);//返回或者history.back( ...
- 【JavaScript】——JS入门
结束XML之旅,開始JavaScript的学习,看视频.了解了她的前世今生,还是为她捏了把汗啊! 看了部分视 频了,简单的总结一下吧! JavaScript是什么? JavaScript是一种基于面向 ...
- iWatch报错: Authorization request cancled
iWatch报错: Optional (Error Domin = com.apple.healthkit Code = 5 "Autherization request canceled& ...
- Android利用Intent与其它应用交互
前言: 上一篇博客给大家聊了Intent的定义.分类.属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent的使用方法. Android系统的一个重要 ...
- Resin 优化配置
1.在resin.conf中的session-config内部添加 <session-max>4096</session-max> <session-timeout> ...