<题目链接>

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

解题分析:

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

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; #define clr(a,b) memset(a,b,sizeof(a))
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define INF 0x3f3f3f3f
const int M = +;
int n,pos;
int path[M],mp[M][M],tax[M],vis[M],dis[M];
char s1[],s2[];
void dfs(int cur,char *s){ //找到这个点之前记录的路径s
if(cur == -)return;
dfs(path[cur],s);
s[pos++]=cur+'';
}
bool Compare(int re,int now) {
pos=;dfs(re,s1);s1[pos] = ''; //将起点到re的最短路径储存
pos=;dfs(now,s2);s2[pos++]=re+'';s2[pos]=; //将起点到u的最短路径储存
if(strcmp(s1,s2)>)return true; //比较两个最短路之间的大小
return false;
}
void Dij(int st,int ed){
rep(i,,n){
dis[i]=mp[st][i]+tax[i]; //将与st直接相连的点,边权与点权相加,视为经过i号城市的代价
if(i==st)continue;
if(dis[i]<INF)path[i]=st; //初始化path
}
rep(i,,n){
int mn=INF,cur;
rep(j,,n) if(dis[j] < mn && !vis[j]) { //找到每一轮的起始节点
mn=dis[j],cur=j;
}vis[cur]=;
rep(k,,n) if(mp[cur][k] < INF){
if(dis[k]>dis[cur]+mp[cur][k]+tax[k]){ //进行松弛,并且记录上一个节点
dis[k]=dis[cur]+mp[cur][k]+tax[k];
path[k]=cur;
}else if(dis[k] == dis[cur]+mp[cur][k]+tax[k] && Compare(k,cur)){
path[k]=cur;
}//若有多条最短路径(最短距离相同的时候)进行字典序大小判断,注意不能只比较一个节点,需要比较整个路径
}
}
}
void show(int cur,int st){
if(cur == st){ cout<<cur; return ;}
show(path[cur],st);
cout<<"-->"<<cur;
}
int main(){
while(~scanf("%d",&n),n){
rep(i,,n) rep(j,,n){
scanf("%d",&mp[i][j]);
if(mp[i][j]==-)mp[i][j]=INF;
}
rep(i,,n)scanf("%d",&tax[i]);
int u,v;while(scanf("%d%d",&u,&v)){
if(u==- && v==-)break;
clr(vis,);clr(path,-);
Dij(u,v);
cout<<"From "<<u<<" to "<<v<<" :"<<endl<<"Path: ";
show(v,u);puts(""); //从终点开始,利用递归,将逆序存储的路径正序输出
cout<<"Total cost : "<<dis[v]-tax[v]<<endl<<endl; //减去终点城市的城市税
}
}
}

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. Java对象之间的深度复制拷贝

    /* * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...

  2. 《深入理解Oracle 12c数据库管理(第二版)》PDF

    一:下载获取位置: 二:本书图样: 三:本书目录: 图书目录: 第1章 安装Oracle 1.1 了解OFA 1.1.1 Oracle清单目录 1.1.2 Oracle基础目录 1.1.3 Oracl ...

  3. 1,环境的搭建,angular

    也是学习一些皮毛,只是把这些经验记录下来而已. 至于angular有什么好处,或者有什么是什么,我就不多做介绍,自己可以去百度,肯定能找到更为详细的. 我使用的是google提供的angualr-cl ...

  4. 在anaconda中安装tensorflow

    打开Anaconda Prompt, step1: 输入清华仓库镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...

  5. python(3):文件操作/os库

      文件基本操作 r,以读模式打开,  r+=r+w, w, 写模式(清空原来的内容), w+=w+r, a , 追加模式, a+=a+r, rb, wb, ab, b表示以二进制文件打开 想在一段文 ...

  6. Jmeter中使用外部的java文件

    感觉在Jmeter中使用外部的Java文件比较方便,语法一样,而且可以直接引用,所以个人觉得这个功能还是蛮重要的,特别是在使用Jmeter的过程中,可能需要结合一定的业务场景进行判断等,那使用Jmet ...

  7. springboot配置Druid监控

    整体步骤: (1)    ——   Druid简单介绍,具体看官网: (2)     —— 在pom.xml配置druid依赖包: (3)    ——  配置application.propertie ...

  8. C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_08_upload\work\Catalina\localhost\ROOT这个错误是找不到temp文件

    C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_08_upload\work\Catalina\localhost\R ...

  9. map映射巧用 A-B Problems

    A-B problem Description 大家都非常熟悉 A+B Problem! 题目看多了也有审美疲劳,于是我舍弃了,改用 A-B problem! 题目是这样的:给出一串数以及一个数字 C ...

  10. Python Day-1 练习

    作业1 要求:1.输入用户密码 2.认真成功后显示欢迎信息 3.输入三次锁定 代码如下: __author__ = 'zhang.ning' username = "zhangning&qu ...