求最大独立集

#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;

}