先写反思给自己看
- dijkstra里的dis数组,初始值为1e18才保险。这场的点数N边数M范围是1e4,边长的范围是1e9。所以初始值无穷应该取到1e18才保险。
- 多组样例,全局变量都初始化一遍吧。虽然说有些数组会在运行过程中被重写。一定要注意样例的组数,如果样例组数过多的话,memset会TLE的,得用for一个一个初始化!
题目链接
- 补充,第一条说得不全对。正无穷应该取到(边数*长度)。
题意
一个有向图,Jerry要从1点走到n点,然而tom想在这些路上拦住jerry,使得jerry从1点走到n点的最短距离变长。拦住一条边的消耗是这条边的长度,求最小的消耗。
思路
设数组dis[i] 表示1点到i点的最短距离,这点我们可以用dijkstra来求。
对于任意从u到v的长度为w的边edge(u, v, w),如果dis[v] == dis[u] + w(u, v);
说明这条边在最短路上。我们把这条边加入到新图中。
最后对新图求最小割,也就是最大流,得到的值就是jerry的最小花费。
要注意的地方
- 一定要把全局变量一个一个初始化了
- 自己造数据测一下看看对不对,图论的数据不好出但还是可以的。
- dijkstra算法里的正无穷一定要取到足够都大!
- 有一个样例是因为没开long long导致没过,我也不知道具体哪个爆了,最后把所有int换成long long了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include