最短路径
1003. Emergency (25)-PAT甲级真题(Dijkstra算法)
1018. Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS)
1030. Travel Plan (30)-PAT甲级真题(Dijkstra + DFS,输出路径,边权)
1072. Gas Station (30)-PAT甲级真题(Dijkstra)
1087. All Roads Lead to Rome (30)-PAT甲级真题-Dijkstra + DFS
1111. Online Map (30)-PAT甲级真题(Dijkstra + DFS)
分析
难度:
1018>1087>1072>1111>1030>1003
P1003
题目大意: 给你N个城市m条路, 起点和终点。每个城市的救援人手,路的
长度。
问:从起点到终点的最短路径条数
最短路径上的救援小组数目之和。
如果有多条就输出点权(城市救援小组数目)最大的那个~
简单题
P1018
题目大意: 每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面
自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车站容量是满的
或空的,控制中心(处于结点0处)就会携带或者从路上收集一定数量的自行
车前往该车站,一路上会让所有的车站沿途都达到完美。现在给出cmax,车
站的数 量n,可以走的边。
问: 问题车站sp,m条边,还有距离,求最短路径。如果最短路径有多个,
求能带的最少的自行车数目的那条。如果还是有很多条不同的路,那么
就找一个从车站带回的自行车数目最少的(带回的时候是不调整的)~
分析:Dijkstra + DFS。如果只有Dijkstra是不可以的,因为minNeed和minBack
路径上的传递不满足最优子结构,不是简单的相加的过程,只有在所有路径都确定了后 才能区选择最小的need和最小的back~Dijkstra求最短路径,dfs求minNeed和
minBack和path,dfs的时候模拟一遍需要调整的过程,求出最后得到的need和back,
与minNeed和minBack比较然后根据情况更新path,最后输出minNeed path 和
minBack,记得path是从最后一个结点一直到第一个结点的,所以要倒着输出~
(摘自柳神博客)注:自行车是去程调整,回程不可以。
个人觉得这是pat上最短路径出的最好的一道题。非常有灵性。
难题,坑题。
P1030
题目大意:给你一张城市地图,起点和终点。
问:求起点到终点的最短路径最短距离和花费,要求首先路径最短,其次花费最少,要输出完整路径
分析: 输出的相对1003多了路径,其他没什么。
简单题
P1072
题目大意:给你一张n1个可能新建的加油站和n2个住所的图。以及存在的边
的距离。和覆盖范围。
问:从m个加油站里面选取1个站点,让他离居民区的最近的人最远,
并且没有超出服务范围ds之内。如果有很多个最远的加油站,输出距离
所有居民区距离平均值最小的那个。如果平均值还是一样,就输出按照
顺序排列加油站编号最小的那个。
分析: 1,结点是字符串。
2, 由于加油站最多10个,想到10次dijstra。
3, 保留1位小数, (int)(a*10.0++0.5)/10.0
4, 10次比较,要初始化。
5,其他倒没什么。
中等。
P1087
题目大意: 给你N个城市,M条边。起点。让你去名为Rome的城市。每个城市
有一个点权[快乐值]
问:求 从起点出发到Rome的最短路径。如果最短路径有多条,那么找到获得
快乐值最大的路径。如果这样的路径还有多条,那么找平均快乐值最大的路径。
并输出有关值。
分析: 1,节点是字符串。
2, 平均快乐值不满足最优子结构。
难度:中等
p1111
题目大意: 给你一张城市地图,每个边有距离和走的时间值。给你起点和终点
问: 1,找到最短路径,如果有多条,那么找耗时最短的,此条是唯一的。
2,找到耗时最短路径,如果有多条,那么找经过节点最少的,此条是唯一的。
分析: 实质就是写两个dijkstra函数。
简单
小结
pat上最短路径的题目, 一共6道。尽管思维量大但可以套板子。
书上的最短路径习题是最简单和最基础的。pat上的题目既要考察基础,也要适当拔高。就好比数学上中值定理题目,你连拉格朗日的公式都不会背,难道还说自己会
做这类题目。编程也是一样。最短路径虽然不像贪心和动态规划那样灵活需要
多做题,但是一定要记住那张最基础的板子,板子实际上就是相当于公式。
pat要拔高最短路径难度可以做的手脚:
1,输入的结点不是数字,而是字符串。或者结点编号不连续。
2,多把尺子,可以是点权,边权。如长度,花费,路径上结点个数,物资。
3,打印路径。最短路径个数
4,有些最优指标可能不满足最优子结构。如平均花费值。这个时候要先用pre存。
之后,DFS找最优路径。