NOIP模拟测试29(A)
T1: 题目大意:有一张有向无环图,第$x$次经过边$i$的代价为$a_ix+b_i$,最多经过$c_i$次,起点为1,$s$个点可作为终点,求走$k$次的最小代价。 我们新建一个汇点,将所有可做为终点的边到汇点连边,那么本题便成为了费用流模型。 贪心策略为:每次走最短路。 证明:路径的顺序是可以改变的,设每次走的路径代价是递增的,如果当前不走最短路,那么以后不可能有一条路能将代价追回,所以当前走最短路一定最优。 但是每次增广代价是不同的,我们只能进行完一次增广之后立即修改边权。 考虑EK,每次用spfa找一条代价最小的增广路,并更新费用即边权,若当前边是正向边,则将正向边权加$a_i$,反向边权减$a_i$,反之将正向边权减$a_i$,反向边权加$a_i$。正向边初始权值为$a_i+b_i$,由于反向边退流退的是上一层的费用,所以初值应赋为$-b_i$。 然后增广k次,若流量不能达到k,输出-1。 spfa复杂度视为$O(NM)$ 时,时间复杂度$O(NMK)$,但远远达不到。 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int N=1010; 6 const int M=20010; 7 const