mxqz TLE
查看原帖
mxqz TLE
406941
Register_int-std=c++14楼主2022/8/19 09:27

rt.费用流寄了,有大佬帮忙调嘛qwq

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 5e3 + 10;
const int MAXM = MAXN * (MAXN - 1);

const int inf = 0x3f3f3f3f;

struct edge {
	int v, w, c, nxt;
} e[MAXM];

int head[MAXN], tot = 1;

void add(int u, int v, int w, int c) {
    e[++tot] = { v, w, c, head[u] }, head[u] = tot;
    e[++tot] = { u, w, 0, head[v] }, head[v] = tot;
}

int dis[MAXN], fl[MAXN], pre[MAXN];

bool inque[MAXN];

bool spfa(int s, int t) {
    memset(dis, 0x80, sizeof dis);
    memset(fl, 0x3f, sizeof fl);
    queue<int> q;
    dis[s] = 0, pre[t] = -1;
    q.push(s), inque[s] = 1;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        inque[u] = 0;
        for (int i = head[u], v; i; i = e[i].nxt) {
        	v = e[i].v;
            if (e[i].c > 0 && dis[v] < dis[u] + e[i].w) {
                dis[v] = dis[u] + e[i].w;
                fl[v] = min(e[i].c, fl[u]);
                pre[v] = i;
                if (!inque[v]) q.push(v), inque[v] = 1;
            }
        }
    }
    return ~pre[t];
}

int mc, mf;

inline 
void mcmf(int s, int t) {
    while (spfa(s, t)) {
        mc += fl[t] * dis[t], mf += fl[t];
        for (int p = t; p != s; p = e[pre[p] ^ 1].v) {
        	e[pre[p]].c -= fl[t], e[pre[p] ^ 1].c += fl[t];
		}
    }
}

int n, m, k, s, t;

inline 
int pos(int i, int j) {
	return n * (i - 1) + j;
}

int x;

int main() {
    scanf("%d%d", &n, &k), m = n * n, s = 0, t = m << 1 | 1;
    add(s, pos(1, 1), 0, k), add(m + pos(n, n), t, 0, k);
    for (int i = 1; i <= n; i++) {
    	for (int j = 1; j <= n; j++) {
    		scanf("%d", &x);
    		add(pos(i, j), m + pos(i, j), x, 1);
    		add(pos(i, j), m + pos(i, j), 0, inf);
    		if (i < n) add(m + pos(i, j), pos(i + 1, j), 0, inf);
    		if (j < n) add(m + pos(i, j), pos(i, j + 1), 0, inf);
		}
	}
	mcmf(s, t);
	printf("%d", mc);
}
2022/8/19 09:27
加载中...