CF724E Goods transportation

https://www.luogu.com.cn/problem/CF724E

模拟最小割nb题

首先可以轻易得到最大流的建图,每个点往后连边,大小为\(C\)\(S\)\(i\)\(p_i\),\(i\)\(T\)\(s_i\)

因为最大流=最小割
考虑DP出最小割
\(f[i][j]\)为考虑了前\(i\)个,有\(j\)个割掉了\(->T\)的边

然后看当前点割那条边来转移

code:

#include<bits/stdc++.h>
#define ll long long
#define N 20050
using namespace std;
int n, c;
ll a[N], b[N], f[2][N];
int main() {
    scanf("%d%d", &n, &c);
    for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
    for(int i = 1; i <= n; i ++) scanf("%lld", &b[i]);
    
    memset(f, 0x3f, sizeof f);
    f[0][0] = 0;
    for(int i = 1; i <= n; i ++) {
        f[i & 1][0] = f[(i & 1) ^ 1][0] + a[i];
        for(int j = 1; j <= i; j ++) f[i & 1][j] = min(f[(i & 1) ^ 1][j - 1] + b[i], f[(i & 1) ^ 1][j] + a[i] + 1ll * c * j);
    }
    ll ans = f[n & 1][0];
    for(int i = 0; i <= n; i ++) ans = min(ans, f[n & 1][i]);
    printf("%lld", ans);
    return 0;
}
posted @ 2021-12-16 20:45  lahlah  阅读(28)  评论(0编辑  收藏  举报