求助 前三个ac后面re
查看原帖
求助 前三个ac后面re
307940
aaaaaaaawsl楼主2022/8/4 20:09

感谢

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long

using namespace std;

const int Inf = 210000000;
const int N = 110;
const int M = 1e5 + 10;

int zx[5] = {0, 0, 0, -1, 1};
int zy[5] = {0, 1, -1, 0, 0};

int n, m ,t[N][N];
int rt1, rt2;

int Next[M << 1], head[M << 1], e[M << 1], v[M << 1], idx = 1;
void add(int a, int b, int c){
	e[++ idx] = b; Next[idx] = head[a]; head[a] = idx; v[idx] = c;
}

int dep[N], q[N], l, r;
bool bfs(){
	memset(dep, 0, sizeof dep);
	l = r = 1;
	q[1] = rt1;
	dep[rt1] = 1;
	while(l <= r){
		int u = q[l ++]; 
		for(int i = head[u]; i; i = Next[i]){
			int j = e[i];
			if(v[i] && !dep[j]){
				dep[j] = dep[u] + 1;
				q[++ r] = j;
			}
		}
	}
	return dep[rt2]; 
}
int dfs(int u, int in){
	if(u == rt2) return in; 
	int out = 0;
	for(int i = head[u]; i && in; i = Next[i]){
		int j = e[i];
		if(v[i] && dep[j] == dep[u] + 1){
			int res = dfs(j, min(v[i], in));
			v[i] -= res;
			v[i ^ 1] += res;
			in -= res; 
			out += res;
		}
	}
	if(out == 0)  dep[u] = 0;
	return out;
}

int ans;

int hsh(int a, int b){
	return (a - 1) * m + b;
}

signed main(){
	scanf("%lld%lld", &n, &m);
	rt1 = (n * m) + 1;
	rt2 = (n * m) + 2;
	for(int i = 1; i <= n; ++ i)
		for(int j = 1; j <= m; ++ j)
			scanf("%lld", &t[i][j]);
		
	for(int i = 1; i <= n; ++ i){
		for(int j = 1; j <= m; ++ j){
			if(t[i][j] == 1){
				add(rt1, hsh(i, j), Inf);
				add(hsh(i, j), rt1, 0);
			}
			else if(t[i][j] == 2){
				add(hsh(i, j), rt2, Inf);
				add(rt2, hsh(i, j), 0);
			}
		}
	}
	
	for(int i = 1; i <= n; ++ i){
		for(int j = 1; j <= m; ++ j){
			for(int k = 1; k <= 4; ++ k){
				if(i + zx[k] <= n && i + zx[k] >= 1 && j + zy[k] >= 1 && j + zy[k] <= m){
					add(hsh(i, j), hsh((i + zx[k]), (j + zy[k])), 1);
					add(hsh((i + zx[k]), (j + zy[k])), hsh(i, j), 0);
				}
			}
		}
	}
	
	while(bfs()) ans += dfs(rt1, 1e18);
	printf("%lld\n", ans);
	return 0;
}
2022/8/4 20:09
加载中...