图论习题2
[刷题记录]图论习题2(最短路综合应用)
- 图论中最短路算法(包括$SPFA$和$Dijkstra$)的一部分基础习题,也结合了许多其他知识点,如$dp$、贪心等
Vijos P1635 城市链接
题意
- 简化:给一个有向有权图,要求输出最短路径经过的点和最短路长度
题解
- 裸一个$SPFA$或者$Dijkstra$,开一个$pre$数组在每次节点更新时记录一下(记录方式为$pre[v]=u$,意思是记录每一个节点的前驱),最后从$pre[n]$倒序拷贝到一个数组里然后顺序输出即可
AC代码
1 |
|
NOIP 2009 提高组 T3 最优贸易
题意
- 简化:给一个有向无权图,每个节点有一个数值(代表商品价格),现在有一个商人从起点经过若干点(可重复经过)到达终点,途中可以选择一个点的价格买入商品,再在之后经过的某一个卖出商品(买入卖出操作只能有一次),问最大利润是多少?
题解
- 题目的意思很清楚了,就是要求你从起点出发到一个点以价格1买入,再到这个点之后以价格2卖出,求这两个价格的最大差值
- 我们可以想到$SPFA$,它可以求出从起点到每一个点的最短路,那么这里是无权图,所以我们的“最短”可以定义为节点的价格最小,这样过一遍$SPFA$就可以求出到达每个节点买入价格的最小值
- 还剩下从每一个节点到所有之后的节点的最大值,怎么求呢?
- 逆向思维:我们从该点出发往下一个点走,就相当于下一个点往我们这边走,因此我们可以反向建图,再从终点开始往起点过一遍$SPFA$(但这里是求“最长”,即每个点的最大价格)就可以求出从每个点出发到终点能够卖出的最大价格
这样,我们已经求出了以下两部分:
- 从起点出发到每个点买入的最小价格
- 从每个点出发到终点卖出的最大价格
然后只需要对每个点求出这两者的最大差值即可
AC代码
1 |
|
未完待续
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!