萌新求助64pts
查看原帖
萌新求助64pts
275079
Rainylower楼主2023/3/30 19:23
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int const maxn = 1100;
int const inf = 0x3f3f3f3f;



int head[maxn*maxn],pre[maxn*maxn],flow[maxn*maxn],dep[maxn*maxn],n,m,s,t,p[maxn][maxn],cnt = 1;
int dx[5] = {0,0,0,-1,1},dy[5] = {0,1,-1,0,0};
struct edg{
	int v,nxt;
	ll w;
}e[maxn*maxn];

bool vis[maxn*maxn];
int id(int x,int y){
	return (y-1)*n + x;
}
void add(int u,int v,int w){
	e[++cnt].w = w;
	e[cnt].v = v;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}
bool check(int x,int y){
	return x>=1&&x<=n&&y>=1&&y<=m;
}
int now[maxn];

bool bfs(){
	queue<int> q;
	q.push(s);
	memset(dep,0,sizeof dep);
	dep[s] = 1;
	now[s] = head[s];
	while(q.size()){
		int u = q.front();
		
		q.pop();
		for(int i = head[u];i;i = e[i].nxt){
	//		cout << i <<"  "<< e[i].v<<"  "<<e[i].w<<"  "<<dep[e[i].v]<<'\n';
			int v = e[i].v;
	now[v] = head[v];
			if(e[i].w&&dep[v]==0){
			
				dep[v] = dep[u] + 1;
				
				q.push(v);
				if(v==t)return 1;
			}
		}	
	}
	return 0;
}

ll dfs(int u,ll flow){
	ll sum = 0;
	if(u==t)return flow;
	for(int i = now[u];i&&flow;i = e[i].nxt){
		int v = e[i].v;
		
		now[u] = i;
		if(e[i].w&&dep[v]==dep[u] + 1){
			ll k = dfs(v,min(flow,e[i].w));
			if(k==0)dep[v]==0;
			e[i].w -= k;
			e[i^1].w += k;
			sum += k;
			flow-=k;
		} 
	}
	return sum;
}
int main(){
	cin >> m >> n;
	s = 0,t = m*n+m+n;
	ll sum = 0;
	for(int i = 1;i <= m;i ++){
		for(int j = 1;j <= n;j ++){
			cin >> p[i][j];
			sum += p[i][j];
		}
	}
	for(int i = 1;i <= m;i ++){
		for(int j = 1;j <= n;j ++){
			if(id(j,i)%2==0){
		//		cout << id(j,i) <<"   "<< t <<"  "<<cnt+1<<'\n';
				add(id(j,i),t,p[i][j]);
				add(t,id(j,i),0);
				continue;
			}
			add(s,id(j,i),p[i][j]);
			add(id(j,i),s,0);
		//	cout << id(j,i) <<"   "<< s <<"  "<<cnt+1<<'\n';
			for(int k = 1;k <= 4;k ++){
				int x = j + dx[k],y = i + dy[k];
				if(check(x,y)){
		//			cout << id(j,i) <<"   "<< id(x,y) <<"   "<<cnt+1<<'\n';
					add(id(j,i),id(x,y),inf);
					add(id(x,y),id(j,i),0);
				}
			}
		}
	}
	ll maxflow = 0;
	while(bfs()){
//		cout << maxflow<<'\n';
		maxflow += dfs(s,inf);
			
	}
	cout << sum -maxflow;
	return 0;
	
}



2023/3/30 19:23
加载中...