90 求调
查看原帖
90 求调
953850
qweasdqweasdqw楼主2024/12/10 09:55
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,m,T;
int a[100][100];
int net[N],to[N],h[N],val[N],cnt=1;
void add(int u,int v,int w)
{
	net[++cnt]=h[u];
	h[u]=cnt;
	to[cnt]=v;
	val[cnt]=w;	
}
int s,t; 
int incf[N],vis[N],pre[N];
bool ek()
{
	queue<int>Q;
	memset(vis,0,sizeof vis);
	Q.push(s);
	incf[s]=1<<30;
	vis[s]=1;
	while(!Q.empty())
	{
		int u=Q.front();
		Q.pop();
		for(int i=h[u];i;i=net[i])
		{
			int v=to[i];
			if(val[i]<=0)continue;
			if(vis[v])continue;
			vis[v]=1;
			incf[v]=min(incf[u],val[i]);
			pre[v]=i;
			Q.push(v);
			if(v==t)return true;
		}
	}
	return false;
}
int sum=0;
void updata()
{
	int v=t;
	while(v!=s)
	{
		int k=pre[v];
		val[k]-=incf[t];
		val[k^1]+=incf[t];
		v=to[k^1];
	}
	sum+=incf[t];
}
void mem()
{
	cnt=1;
	sum=0;
	memset(h,0,sizeof h);
	memset(net,0,sizeof net);
	memset(to,0,sizeof to);
	memset(val,0,sizeof val);
}
int b[8][2]={{-1,-2},{-2,-1},{1,-2},{2,-1},{-1,2},{-2,1},{1,2},{2,1}};
int main()
{
	cin>>n;
	s=0;
	t=n*n+1;
	int num=0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		char x;
		cin>>x;
		if(x=='0')
		a[i][j]=0;
		else
		a[i][j]=1;
		if(a[i][j])
		num++;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j])continue;
			if((i+j)&1)
			{
				add(s,(i-1)*n+j,1);
				add((i-1)*n+j,s,0);
				if(!a[i][j])
				{
					for(int k=0;k<8;k++)
					{
						int fx=i+b[k][0];
						int fy=j+b[k][1];
						if(fx>=1&&fx<=n&&fy>=1&&fy<=n)
						{
							add((i-1)*n+j,(fx-1)*n+fy,1<<30);
							add((fx-1)*n+fy,(i-1)*n+j,0);
						}
					}
				}
			}
			else
			{
				add((i-1)*n+j,t,1);
				add(t,(i-1)*n+j,0);
			}
		}
	}
	while(ek())
	{
		updata();
	}
	cout<<n*n-num-sum<<endl;
}
2024/12/10 09:55
加载中...