好了,用了一个月的时间终于把图论套题刷个差不多,也意识到了自己的许多不足,同时也感觉自己能里还需要提升,其中还剩下两道网络流的问题,由于我现在还没时间去学,就现空过去了,下面开始总结下最短路的几个条件与问题,便于以后复习,也同时把最短路的一些总结的技巧分享给你们。
一、例题总结
1.Til the Cows Come Home ※
该题是标准的最短路题,也不需要任何变式,题意给你n个点,求n->1的最短路
2.Frogger ※※
题目大意,给你n个点的坐标,青蛙要从第一个点跳到第二个点,要求青蛙每一次跳的距离要尽可能的小,输出最小的每一跳的距离,这题属于最短路更新条件的变式,即要跳的尽可能的小,就是要求过程中的最大值,最大值即为从a->b最小每次跳这个,才能由a到b,再每一个点维护一个最小值,所以说这是维护过程中最大值求最小值的题目,即dis[e]=min(dis[e],max(dis[u],edge[i].w)),然后注意一下输出是.f即可,我也不知道为啥
题解链接:题解链接
3.Heavy Transportation ※※
题目链接:http://poj.org/problem?id=1797
题目大意:要把货物从1运到n,每条路都有一个最大称重量,问怎么才能运到n的货物最多。我们先考虑,要满足不能超过路的最大称重量即再过程中要维护一个最小值,再与不同路径之间维护一个最大值,所以聪明的你会发现,这其实与上面的题刚好相反,即维护过程中最小值不同路径的最大值问题,即dis[e]=max(dis[e],min(dis[u],edge[i].w))。
4.Currency Exchange ※※
5.Wormholes ※※
题解:标准正负权回路问题,详情参考:解决正负权回路
6.MPI Maelstrom ※※ POJ1502
题目大意:给你个一半的矩阵,因为双向,给你一半另一半也就出来,默认自己到自己是0,走了也没关系,矩阵中如果出现x则说明,不能到达那个点,令距离=INF就好了。
7.Cow Contest ※※
题目大意;输入几组数据,分别表示前者可以打败后者,这题起初我也不会,我当时wa了是因为,没考虑到1打败2,2打败3,1能打败3的时候,思路懵住之后才知道,这题属于我一个不会的算法,但是非常容易理解看了一遍之后就会了,接着AC,Floyd传递闭包问题,参考链接:Floyd传递闭包
8.Arbitrage ※※
题目大意:标准正负权回路,只是多了字符串处理,我用的map处理,直接上链接:https://blog.csdn.net/qq_43857314/article/details/87280422
9.Invitation Cards ※※
题目大意:要求从1到各个点的最小距离之和+各个点到1的最小距离之和,这是最短路的标准模板,结果提交T掉,一想就不对跑了N次最短路把,所以说换一种思维,反向建图,跑各个点到1的最短路的时候,把图反过来,再跑一遍1-各个点,即为各个点到1的最短距离,这题题本质不难,难在思路转换,以后一定要注意。
10.Candies ※※※
题目大意:给你糖果限制,几组数据,表示谁比谁多几个糖果,最后求出1最多比n多多少个糖果,标准的差分约束系统,这是一个最大值,即a-b>=x,与最短路联系起来,更新a-b的最短路,最短路即为a-b的最大值,附一下AC代码:https://pasteme.cn/3982
11.Subway ※※※ POJ2502
题目大意:输入起点与终点坐标,输入几条火车线,包括火车停靠站的坐标,要求出从起点到终点的最小值,这个题其实关键在于建图,建好图之后这题就是一个标准的最短路模板,首先一条铁路航线之间自己建图双向权值为距离/火车速度,任意点之间互相建图,因为一条铁路航线之间已经建完不能重新覆盖,所以实现用一个关系矩阵标记一下,如果之前建立过两点之间的边,那么就标为1,再次建的时候就不建了,然后剩下的各点之间连起来双向权值为距离/walk速度,然后跑一边spfa,解决啦。
12.昂贵的聘礼 ※※※ POJ1062
题目大意:起点1是一件衣服的价值,这件衣服可以用其他人手中的替代品来换,哎呀呀,其实是中文题目,我就不解释了。刚开始我的思路是这样的,从1开始看看dis[i]的最小值(先忽略等级限制),然后这样没法与等级限制相联系,所以只能由n-1然后自己找一下替代的关系(通过画图),然后因为有等级限制也就是说,在换的过程中,最高等级与最低等级最大相差m,由于1号点不一定是最大等级,所以我们用枚举的方法,首先求出lmin等级最低和lmax等级最高,lmin,lmin+m一直枚举到lmax,lmax+m即可,更细你最短路时判断一下下一个点在不在范围内就可以最后求出最小值,即为最小价值。
13.Tram ※※ POJ1847
题目大意: 问最短需要改变几次开关的方向,其实思路很简单,第一个标记为0(刚开始与其相连),然后后面几个标记为1,只要改就会增加1,所以这样更改次数最小也就出来,输出即可。简单题目最短路不需要再附代码了把。
14.Extended Traffic ※※ 除了那套题没找到链接,自己去搜搜吧。
这个题是一个最短路问题,边的权值为两点之间权值的立方,差的立方可能会出现负权值,所以应该判断有没有负权圈之后再输出,有负权圈说明找不到最小值或者INF(连接不到),即按照题目输出即可。
附一下题解代码:https://pasteme.cn/3985
15.The Shortest Path in Nya Graph ※※※※ 2013 ACM ICPC
这个题目确实是个好题,以至于我现在弄懂也是迷迷糊糊的,以后再慢慢总结,这道题的思想再于建图,有一个坑点就是 同层之间的点 不一定为0。多了一个条件-层,所以我们可以把层看作一个点,层到这每个点的距离设为0单向必须是单向,不是单向的话同层之间就不是0了,然后 这个层与相邻层上的点权值是c单向,由点到层,双向没有试,不确定。然后跑!注意建图的时候用了分层建图的思想,用2*n的空间建图。具体我也解释不了这个题,水平有限,直接上代码:https://pasteme.cn/3986
16.Layout POJ3159 ※※
题目大意:这个题就是一个差分约束,只不过判断了一下差分约束的解的存在性:1.如果dis[n]有值即为,该题的答案2.如果出现权圈,则说明该解不存在 3.如果 dis[n]=INF,说明两点之间没有关系,没有约束,可以任意取值。
附一下代码:https://pasteme.cn/3987
二、关于技巧与总结
- 做最短路的过程中首先不要忘记初始化,我通常喜欢用一个void restart()函数,关系矩阵一定不要忘记初始化0,邻接表如果用链式前向星一定不要忘记head初始化-1,与head移动的值归0.
- 在保留边的权值最小值的时候,如果保留过程中路径最大值,起始点就赋值为-INF,如果最小值起始点赋值为INF
- 建图的思想一定要有,类似与invitation cards这种反向建图的思想一定要经常使用
- 注意题目中边的权值是否可以为负,如果出现可能会出现负权圈。
- 注意下差分约束解的存在性。
- 又例如上题subway中,分块建图时,一定要做好关系矩阵,别让现在的权值被覆盖。
FIght!