题意:在一个图内,删除一条边的代价是这条路的长度。现在需要求使从点1到点n最短路变长的最小代价。(不需要保证必须存在一条通路)
输入:组数(1-10)
点数(1-10000) 路数(1-10000)
起点 重点 长度
……
输出:最小代价
Sample Input
1
3 4
1 2 1
2 3 1
1 3 2
1 3 3
Sample Output
3
思路:按照网上流行的类似题目算法,需要用SPFA跑出最短路,再用搜索搜出所有在最短路里面路径重新建图,再跑最小割。但是那样的复杂度是真的高,过是过不了的,这辈子不可能过的(。)
后来问了实验室的大佬,大佬轻描淡写地告诉我们一个跑最短路图的方便方法。
先跑一遍迪杰斯特拉,然后就能得到一个点1到所有点的最短路的数组。如果存在一条边m,他的终点到点1的距离减去他的起点到点1的距离如果正好等于这条边的长度,那么这条边的就在最短路集里面。
太强了,简直震撼我全家,我怎么就不知道这么酷的性质(。)
然后泡最小割也不能用dinic。dinic太弱了,应该使用强大而快速的ISAP,这样就能轻轻松松过这个题目了。
代码不是俺写滴,感谢伟大的找板子之王
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namesp