题目链接
题目类型:最短路 + 最小割(网络流)
题目分析
题目大意
n
个点,m
条边,然后给出每条无向边的u, v, w
,表示一条边从u
指向v
但是如果要在这条边上设置障碍,需要耗费木材量w
,注意,每条路的距离是相等的。现在将军在1
点,而敌人在n
点,敌人一定会从最短路来找将军,将军想要知道最少需要花费多少木材才能一定让敌人遇到障碍。
解析
一开始忽略了最短路的条件,直接跑了网络流,大意了。
题目中说敌人一定会从最短路来找将军,那么我们跑最小割的时候实际上只需要跑若干条最短路所形成的图即可。那么问题很容易的转化成了:如何找到所有最短路,以及如何在网络流的图中建图。找到最短路我们可以用SPFA,然后用一个vector记录到每个点最短距离的所有前驱。然后我们从终点,也就是n
反向进行bfs就可以将网络流的图建出来了。此处要注意的是,在网络流中是单向加边,所以我们只考虑从将军到敌人的方向的边即可,这个其实也不难实现,因为我们BFS是从n
点反向往1
点跑的。
其他细节处理:输入的w用pair到int的映射存储,在这里我觉得这个用的还是挺合适的。
其实可以用ISAP写,但是怕网络赛的时候模版重了,所以使用dinic写了,不过跑的也挺快的,不知道是不是数据比较弱。
代码
1 |
|