网络流好难,样例都过不去啊
查看原帖
网络流好难,样例都过不去啊
291604
王茗仟楼主2023/2/17 20:45
#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}


int xx[]={1,0,-1,0};
int yy[]={0,1,0,-1};

int a[1011][1111];

int n,m;
struct edge{
	int u,v,w;
	int nx;
}e[M];
int tot,head[N],cur[N];

in void add(re int u,re int v,re int w){
	e[tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].nx=head[u];
	head[u]=tot++;
}

int dep[N];
int s,t;

int num(int i,int j){
	return ((i-1)*m+j);
}

bool bfs(){
	memset(dep,0,sizeof(dep));
	queue<int>q;
	dep[s]=1;
	q.push(s);
	cur[s]=head[s];
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(re int i=head[u];~i;i=e[i].nx){
			int v=e[i].v;
			cur[v]=head[v];
		//	debug;
			if(dep[v]==0&&e[i].w>0){
				dep[v]=dep[u]+1;
				if(v==t) return 1;
				q.push(v);
			}
		}
	}
	
	return 0;
}

int dfs(int u,int lim){
	int flow=0;
	if(u==t) return lim;
	for(int i=cur[u];~i;i=e[i].nx){
		int v=e[i].v;
		cur[u]=i;
		debug;
		if(dep[v]==dep[u]+1&&e[i].w>0){
			int minf=dfs(v,min(e[i].w,lim));
			if(minf){
				lim-=minf;
				flow+=minf;
				e[i].w-=minf;
				e[i^1].w+=minf;
				if(lim==0) return flow;
			}
		}
	}
	return flow;
}

int dinic(){
	int ans=0;
//		debug;
	while(bfs()){
		ans+=dfs(s,INF);
	}
	return ans;
}


signed main(){
	memset(head,-1,sizeof(head));
	n=read();m=read();	
	s=n*m+1,t=n*m+2;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=read();
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				add(s,num(i,j),INF);
				add(num(i,j),s,0);
			}
			if(a[i][j]==2){
				add(num(i,j),t,INF);
				add(t,num(i,j),0);
			}
		}
	}
	for(int x=1;x<=n;x++){
		for(int y=1;y<=m;y++){
			for(int i=0;i<4;i++){
				if(dx<=n&&dy<=m&&dx>=1&&dy>=1){
					add(num(x,y),num(dx,dy),1);
					add(num(dx,dy),num(x,y),0);
					add(num(x,y),num(dx,dy),0);
					add(num(dx,dy),num(x,y),1);
				}
			}
		}
	}
	cout<<dinic()<<endl;
	return 0;
}

















2023/2/17 20:45
加载中...