一、入门难度
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]<dist[j],很简单,直接记录cost[j],dist[j]就好了
2.dist[u]+map[u][j]==dist[j]
如果还满足cost[u]+map2[u][j]<cost[j],更新cost[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<string,int>容器就行字符串到整数的映射。
二、提高难度
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中的所有顶点相连,即此题可以转换成求s到t的最短路径。
算法补充:
在建图的过程中,如果两个顶点之间的距离大于d了,即两个顶点之间无法一步到达,所以此时将权值赋为无穷大。
三、省选难度