有点好奇
查看原帖
有点好奇
494504
Sansyen楼主2022/4/2 20:55
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N = 60010,M = 500010,INF = 1e8;
bool st[N];
int n,m,k,S,T;
int h[N],e[M],f[M],ne[M],idx;
int dep[N],cur[N];
int nx[10] = {1,3,3,1,-1,-3,-3,-1},ny[10] = {3,1,-1,-3,-3,-1,1,3};
void add(int a,int b,int c){
	e[idx] = b,f[idx] = c,ne[idx] = h[a],h[a] = idx++;
	e[idx] = a,f[idx] = 0,ne[idx] = h[b],h[b] = idx++;
}
bool bfs(){
	memset(dep,-1,sizeof dep);
	queue<int>q;
	dep[S] = 0,cur[S] = h[S],q.push(S);
	while(!q.empty()){
		auto u = q.front();
		q.pop();
		for(int i = h[u] ; ~i ; i = ne[i]){
			int ver = e[i];
			if(dep[ver] == -1 && f[i]){
				dep[ver] = dep[u] + 1;
				cur[ver] = h[ver];
				if(ver == T)return true;
				q.push(ver);
			}
		}
	}
	return false;
}
int dfs(int u,int limit){
	if(u == T)return limit;
	int flow = 0;
	for(int i = cur[u];~i && flow < limit; i = ne[i]){
		cur[u] = i;
		int ver = e[i];
		if(dep[ver] == dep[u] + 1 && f[i]){
			int t = dfs(ver,min(f[i],limit - flow));
			if(!t)dep[ver] = -1;
			else f[i] -= t,f[i ^ 1] += t,flow += t;
		}
	}
	return flow;
}
int dinic(){
	int ans = 0,flow;
	while(bfs())while(flow = dfs(S,INF))ans += flow;
	return ans;
}
void solve(){
	cin >> n >> m >> k;
	memset(h,-1,sizeof h);
	S = 0,T = n * m + 1;
	int ans = n * m;
	for(int i = 1;i <= k; i ++){
		int x,y;
		cin >> x >> y;
		if(!st[(x - 1) * m + y])ans--;
		st[(x - 1) * m + y] = 1;
	}
	for(int i = 1;i <= n; i ++){
		for(int j = 1;j <= m; j ++){
			if(st[(i - 1) * m + j])continue;
			if(i & 1){
				add(S,(i - 1) * m + j,1);
				for(int k = 0;k < 8 ; k++){
					int nowx = i + nx[k];
					int nowy = j + ny[k];
					if(nowx < 1 || nowx > n || nowy < 1 || nowy > m||st[(nowx - 1) * m + nowy])continue;
					add((i - 1) * m + j,(nowx - 1) * m + nowy,1);
				}
			}
			else add((i - 1) * m + j,T,1);
		}
	}
	ans -= dinic();
	cout << ans << '\n';
}
int main(){
	solve();
	return 0;
}

2022/4/2 20:55
加载中...