1 条题解

  • 1
    @ 2020-08-30 21:59:24

    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <queue>
    #include <vector>

    typedef long long ll;
    const int N = 1205;
    const ll INF = 1e18;

    int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
    }
    while (isdigit(c)) {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
    }
    return x * f;
    }

    ll min(ll x, ll y) {
    if (x <= y) return x; return y;
    }

    struct Edge {
    int from, to; ll flow, cap, cost;
    };
    std::vector<Edge> edges;
    std::vector<int> G[N];
    int S, SS, T, n, p[N]; ll d[N], a[N];

    void addedge(int from, int to, ll cap, ll cost) {
    edges.push_back((Edge){from, to, 0, cap, cost});
    edges.push_back((Edge){to, from, 0, 0, -cost});
    int size = edges.size();
    G[from].push_back(size - 2);
    G[to].push_back(size - 1);
    }

    bool SPFA(ll &flow, ll &cost) {
    bool inq[N] = {}; inq[S] = 1;
    std::queue<int> Q; Q.push(S);
    for (int i = 0; i < n; ++ i) d[i] = INF;
    d[S] = p[S] = 0, a[S] = INF;
    while (!Q.empty()) {
    int u = Q.front(); Q.pop(), inq[u] = 0;
    int size = G[u].size();
    for (int i = 0; i < size; ++ i) {
    Edge e = edges[G[u][i]];
    if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
    d[e.to] = d[u] + e.cost;
    p[e.to] = G[u][i];
    a[e.to] = min(a[u], e.cap - e.flow);
    if (!inq[e.to]) Q.push(e.to), inq[e.to] = 1;
    }
    }
    }
    if (d[T] == INF) return false;
    flow += a[T], cost += a[T] * d[T];
    int x = T;
    while (x != S) {
    edges[p[x]].flow += a[T], edges[p[x]^1].flow -= a[T];
    x = edges[p[x]].from;
    }
    return true;
    }

    ll mincost() {
    ll flow = 0, cost = 0;
    while (SPFA(flow, cost)) {}
    return cost;
    }

    int main() {
    n = read(); int k = read(); S = 0, SS = n * 6 + 1, T = SS + 1;
    addedge(S, SS, k, 0);
    for (int i = 1; i <= n * 3; ++ i) {
    int x = read();
    addedge(SS, i, 1, 0);
    addedge(i, i + n * 3, 1, -x);
    addedge(i + n * 3, T, 1, 0);
    for (int j = i + n; j <= n * 3; ++ j)
    addedge(i + n * 3, j, 1, 0);
    }
    n = T + 1;
    printf("%lld\n", -mincost());
    return 0;
    }

  • 1

信息

ID
1056
难度
9
分类
(无)
标签
(无)
递交数
1
已通过
1
通过率
100%
上传者