玄学 DINIC MLE 求助
查看原帖
玄学 DINIC MLE 求助
799877
AK_heaven楼主2024/1/24 14:50

80 pts

code :

#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int maxn = 1e7 + 1550000;
int h1[10000005], h2[10000005], cnt, dep[10000005];
int n, m, s, t;
struct Edge {
	int v, last, c, f;
} e[maxn];

void add(int u, int v, int c) {
	e[cnt] = {v, h1[u], c, 0};
	h1[u] = cnt++;
	e[cnt] = {u, h1[v], 0, 0};
	h1[v] = cnt++;
}

bool bfs() {
	memset(dep, 0, sizeof(dep));
	queue<int> q;
	q.push(s); dep[s] = 1;
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		for(int i = h1[u]; ~i; i = e[i].last) {
			int v = e[i].v;
			if(!dep[v] && e[i].c > e[i].f) {
				dep[v] = dep[u]+1, q.push(v);
			}
		}
	}
	return dep[t];
}

int dfs(int u, int flow) {
	if(u == t || !flow) return flow;
	int ret = 0;
	for(int &i = h2[u]; ~i; i = e[i].last) {
		int v = e[i].v, d;
		if(dep[v] == dep[u]+1 && (d = dfs(v, min(flow-ret, e[i].c - e[i].f)))) {
			ret += d, e[i].f += d, e[i^1].f -= d;
			if(ret == flow) return flow;
		}
	}
	return ret;
}

int MF() {
	int ans = 0;
	while(bfs()) {
		memcpy(h2, h1, sizeof(h2));
		ans += dfs(s, 1<<30);
	}
	return ans;
}

int id(int x, int y) {
	return n*x+y;
}

signed main() {
//	freopen("P4001.out", "w", stdout);
//	freopen("P4001_5.in", "r", stdin);
	cin >> n >> m;
	memset(h1, -1, sizeof(h1));
	s = id(1, 1);
	t = id(n, m);
	for(int i = 1; i <= n; i++) {
		int v;
		for(int j = 2; j <= m; j++)
		  cin >> v, add(id(i, j-1), id(i, j), v), add(id(i, j), id(i, j-1), v);
	}
	for(int i = 2; i <= n; i++) {
		int v;
		for(int j = 1; j <= m; j++)
		  cin >> v, add(id(i-1, j), id(i, j), v), add(id(i, j), id(i-1, j), v);
	}
	for(int i = 2; i <= n; i++) {
		int v;
		for(int j = 2; j <= m; j++) 
		  cin >> v, add(id(i-1, j-1), id(i, j), v), add(id(i, j), id(i-1, j-1), v);
	}
	cout << MF();
	return 0;
}
2024/1/24 14:50
加载中...