求最大独立集
#include
#include
#include
#include
#include
using namespace std;
int dx[8]={-1,-2,1,2,-1,-2,1,2};
int dy[8]={-2,-1,-2,-1,2,1,2,1};
struct node{
int x,y,next;
}a[350000];
int len,last[40010];
void ins(int x,int y){
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
char s[210][210];
int match[40010];
bool chw[40010];
bool find_muniu(int x){
for (int k=last[x];k;k=a[k].next){
int y=a[k].y;
if (chw[y]==true)
{chw[y]=false;
if(match[y]==0||find_muniu(match[y])==true)
{match[y]=x;
return true;
}
}
}
return false;
}
int main(){
int n,ss=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if(s[i][j]=='0')
{
ss++;
int bx=(i-1)*n+j,by,xx,yy;
for (int k=0;k<8;k++)
{
xx=i+dx[k],yy=j+dy[k];
if (s[xx][yy]=='0'&&xx>=1&&xx<=n&&yy>=1&&yy<=n)
{
by=(xx-1)*n+yy;
ins(bx,by);
}
}
}
}
int ans=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (s[i][j]=='0')
{
int b1=(i-1)*n+j;
memset(chw,true,sizeof(chw));
if (find_muniu(b1)==true) ans++;
}
}
printf("%d\n",ss-ans/2);
return 0;
}