luogu上过了,但是学校OJ上没过被卡了一个点,MnZn真的卡不动了
TLE on 2004ms/2000ms
#include<bits/stdc++.h>
using namespace std;
const int maxn=40005;
int n,a[maxn],m;
vector<int>v[maxn];
int t;
int march[maxn];
bool mark[maxn];
int num;
int ans;
string s;
int g[maxn];
int dx[9]={0,-1,-2,+1,+2,-1,-2,+1,+2};
int dy[9]={0,-2,-1,-2,-1,+2,+1,+2,+1};
inline int id(int aa,int bb){
return (aa-1)*n+bb;
}
bool sp(int x){
for(int i=0;i<v[x].size();i++){
int to=v[x][i];
if(mark[to]){
continue;
}
mark[to]=1;
if(march[to]==-1||sp(march[to])){
march[to]=x;
return true;
}
}
return false;
}
signed main(){
scanf("%d",&n);
for(register int i(1);i<=n;i++){
cin>>s;
for(int j=0;j<s.size();j++){
if(s[j]=='0'){
g[id(i,j+1)]=1;
num++;
}
else{
g[id(i,j+1)]=0;
}
}
}
for(register int i(1);i<=n;i++){
for(register int j(1);j<=n;j++){
if(g[id(i,j)]&&!((i+j)&1)){
for(int k=1;k<=8;k++){
int nx=i+dx[k];
int ny=j+dy[k];
if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&g[id(nx,ny)]){
v[id(nx,ny)].push_back(id(i,j));
v[id(i,j)].push_back(id(nx,ny));
}
}
}
}
}
memset(march,-1,sizeof(march));
for(register int i(1);i<=n;i++){
for(register int j(1);j<=n;j++){
memset(mark,0,sizeof(mark));
if(!((i+j)&1)&&g[id(i,j)]){
if(sp(id(i,j))){
ans++;
}
}
}
}
printf("%d",num-ans);
}