最短路专题练习

一、入门难度

1、HDU 2544(一级)

【题意】

给出n个顶点m条边,以及每条边的权值为w,求1到n的最短路

【思路】

裸题

2、HDU 2066 (一级)

【题意】

因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。

【思路】

这道题其实一次Dijkstra就可以了,我们将草儿的家看做0,从草儿家到相邻镇的花费看做0,那么我们就只需要求草儿家到各个目的地的最短路即可,一次Dijkstra便可解决,n<=1000。

3、HUD 3790 (一级)

【题意】

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

【思路】

这道题目要考虑距离与花销的最小,并且优先满足距离最小。

所以在给dist[u]添加边时会遇到两种情况:

1.dist[u]+map1[u][j]

2.dist[u]+map[u][j]==dist[j]

如果还满足cost[u]+map2[u][j]

4、HDU 1217 (一级)

【题意】

套汇是利用货币汇率的差异将一个货币单位转换为另一个货币单位。 例如,假设1美元买入0.5英镑,1英镑买入10.0法国法郎,1法国法郎买入0.21美元。 然后,通过兑换货币,聪明的交易者可以从1美元开始买入0.5 * 10.0 * 0.21 = 1.05美元,获利5%,现给出各种钱之间的兑换机制,求不断兑换后是否可以产生利润?。

【思路】

利用Floyd思想,求i到j的最大值,检查一下有没有环,若有环,检查一下绕一圈的权值积是否大于1。输入的数据有字符串,可以使用map容器就行字符串到整数的映射。

二、提高难度

1、HDU 3499 (二级)

【题意】

¨n个地点,m条有向边,给出每条边的花费。允许将任意一条边的花费变为一半(向下取整),求起点a到终点b的最小花费

【思路】

¨1.先正向建图,以a为源点跑Dijkstra

¨2.再反向建图,以b为源点跑Dijkstra

¨3.枚举边(作为花费变为一半的边),从a到这条边的起点u使用正向建图的结果,从这条边的终点v使用反向建图的结果,然后再加上这条边边权的一半,就得到这条边花费变为一半时候的总花费。

¨4.将枚举结果取最小值即为最小花费

¨5.注意输入是字符串,可以用map

2、HDU 1385 (二级)

【题意】

¨¨N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度。如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费)。现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和。求最小花费,如果有多条路经符合,则输出字典序最小的路径。

【思路】

¨本题重点在于按字典序最小打印。

¨求最短路的算法最有名的是Dijkstra。所以一般拿到题目第一反应就是使用Dijkstra算法。但是此题要求的好几对起点和终点的最短路径。所以用Floyd是最好的选择。

3、HDU 1245 (二级)

【题意】

¨有一个100*100的正方形湖湖中间有一个直径为15的圆形小岛;¨n个点随机分布在这个正方形中,¨一个人要从小岛上跳出湖外,可以跳跃在这些点上,人每一步能跳的最大距离为d,求能跳出湖外所需的最小的跳跃距离和步数。

【思路】

首先计算每个坐标两两间的距离,然后找出所有能从小岛上一步跳到的点存入数组s中,然后找出所有能一步跳出湖外的点存入数组t中。设置两个虚拟的顶点s和t,s与数组s中的所有顶点相连,t与数组t中的所有顶点相连,即此题可以转换成求st的最短路径。

算法补充:

在建图的过程中,如果两个顶点之间的距离大于d了,即两个顶点之间无法一步到达,所以此时将权值赋为无穷大。

 

三、省选难度

 

你可能感兴趣的:(最短路专题练习)