<题目链接>

题目大意:
给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用。现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且输出最少花费所走的路径,如果有多条路径花费最少,则输出字典序最小的那条。

解题分析:

输出最短路的路径问题,需要注意的是,题目要求输出的最短路径的字典序最小,所以我们在每次松弛的时候,都需要加上判断。如果有多个点的最短路相同,则用DFS求出它们之前走过的路径,并且进行比较,然后选字典序最小的那条。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define clr(a,b) memset(a,b,sizeof(a))
  8. #define rep(i,s,t) for(int i=s;i<=t;i++)
  9. #define INF 0x3f3f3f3f
  10. const int M = +;
  11. int n,pos;
  12. int path[M],mp[M][M],tax[M],vis[M],dis[M];
  13. char s1[],s2[];
  14. void dfs(int cur,char *s){ //找到这个点之前记录的路径s
  15. if(cur == -)return;
  16. dfs(path[cur],s);
  17. s[pos++]=cur+'';
  18. }
  19. bool Compare(int re,int now) {
  20. pos=;dfs(re,s1);s1[pos] = ''; //将起点到re的最短路径储存
  21. pos=;dfs(now,s2);s2[pos++]=re+'';s2[pos]=; //将起点到u的最短路径储存
  22. if(strcmp(s1,s2)>)return true; //比较两个最短路之间的大小
  23. return false;
  24. }
  25. void Dij(int st,int ed){
  26. rep(i,,n){
  27. dis[i]=mp[st][i]+tax[i]; //将与st直接相连的点,边权与点权相加,视为经过i号城市的代价
  28. if(i==st)continue;
  29. if(dis[i]<INF)path[i]=st; //初始化path
  30. }
  31. rep(i,,n){
  32. int mn=INF,cur;
  33. rep(j,,n) if(dis[j] < mn && !vis[j]) { //找到每一轮的起始节点
  34. mn=dis[j],cur=j;
  35. }vis[cur]=;
  36. rep(k,,n) if(mp[cur][k] < INF){
  37. if(dis[k]>dis[cur]+mp[cur][k]+tax[k]){ //进行松弛,并且记录上一个节点
  38. dis[k]=dis[cur]+mp[cur][k]+tax[k];
  39. path[k]=cur;
  40. }else if(dis[k] == dis[cur]+mp[cur][k]+tax[k] && Compare(k,cur)){
  41. path[k]=cur;
  42. }//若有多条最短路径(最短距离相同的时候)进行字典序大小判断,注意不能只比较一个节点,需要比较整个路径
  43. }
  44. }
  45. }
  46. void show(int cur,int st){
  47. if(cur == st){ cout<<cur; return ;}
  48. show(path[cur],st);
  49. cout<<"-->"<<cur;
  50. }
  51. int main(){
  52. while(~scanf("%d",&n),n){
  53. rep(i,,n) rep(j,,n){
  54. scanf("%d",&mp[i][j]);
  55. if(mp[i][j]==-)mp[i][j]=INF;
  56. }
  57. rep(i,,n)scanf("%d",&tax[i]);
  58. int u,v;while(scanf("%d%d",&u,&v)){
  59. if(u==- && v==-)break;
  60. clr(vis,);clr(path,-);
  61. Dij(u,v);
  62. cout<<"From "<<u<<" to "<<v<<" :"<<endl<<"Path: ";
  63. show(v,u);puts(""); //从终点开始,利用递归,将逆序存储的路径正序输出
  64. cout<<"Total cost : "<<dis[v]-tax[v]<<endl<<endl; //减去终点城市的城市税
  65. }
  66. }
  67. }

2018-12-06

HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】的更多相关文章

  1. HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )

    链接:传送门 题意:有 n 个城市,从城市 i 到城市 j 需要话费 Aij ,当穿越城市 i 的时候还需要话费额外的 Bi ( 起点终点两个城市不算穿越 ),给出 n × n 大小的城市关系图,-1 ...

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

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

  3. 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 ...

  4. hdu 1385 Minimum Transport Cost (Floyd)

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

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

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

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

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

  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. hdu Minimum Transport Cost(按字典序输出路径)

    http://acm.hdu.edu.cn/showproblem.php? pid=1385 求最短路.要求输出字典序最小的路径. spfa:拿一个pre[]记录前驱,不同的是在松弛的时候.要考虑和 ...

随机推荐

  1. 纯css使用线性渐变实现滚动进度条(来自于微信前端早读课)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. SpringData使用与整合

    SpringData 整合源码:链接: https://pan.baidu.com/s/1_dDEEJoqaBTfXs2ZWsvKvA 提取码: cp6s(jar包自行寻找) author:Simpl ...

  3. Vue+restfulframework示例

    一.简单回顾vue 前不久我们已经了解了vue前端框架,所以现在强调几点: 修改源: npm config set registry https://registry.npm.taobao.org 创 ...

  4. Vue中使用Vue.component定义两个全局组件,用单标签应用组件时,只显示一个组件的问题和 $emit的使用。

    解决方法: 定义了两个 Vue.component 在 el 中使用的时候要用 双标签, 用单表标签的时候,只会显示第个 组件间 这样写只显示 welcome-button 组件 <welcom ...

  5. Selenium CSS定位语法

    大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css的定位 ...

  6. C++ Primer 笔记——控制内存分配

    1.当我们使用一条new表达式时,实际执行了三步操作. new表达式调用一个名为operator new ( 或者operator new[] ) 的标准库函数.该函数分配一块足够大的,原始的,未命名 ...

  7. 有一个字典对象,d = {'a':1,'b':2},请用尽量简洁的代码将d转换成{1: 'a', 2: 'b'}

    题目:有一个字典对象,d = {'a':1,'b':2},请用尽量简洁的代码将d转换成{1: 'a', 2: 'b'} 第一种方法: d = {'a': 1, 'b': 2}d = {value: k ...

  8. 51Nod 1264 线段相交(计算几何)

    1264 线段相交  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相 ...

  9. Asp.Net MVC Ajax轮训解决Session失效时间

    这种方法不是太好,对服务器得压力大,由于系统是内部人员使用,业务有比较复杂,所以有些值得需要Session去保存,但是,Session有失效时间. 代码如下: $(function () { func ...

  10. 迅速上手:使用taro构建微信小程序基础教程

    前言 由于微信小程序在开发上不能安装npm依赖,和开发流程上也饱受诟病:Taro 是由京东·凹凸实验室(aotu.io)倾力打造的 多端开发解决方案,它的api基于react,在本篇文章中主要介绍了使 ...