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);
}