真心求助,最近的N个帖子都没有回复!!!!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dx[9]={0,1,-1,-2,2,1,-1,-2,2};
int dy[9]={0,-2,2,1,-1,2,-2,-1,1};
int head[100001],n,m,cnt,belong[100001],finds[100001],l_cnt,r_cnt;
bool b[505][505];
struct node
{
int to,next;
}a[1000001];
void add_edge(int from,int to)
{
a[++cnt].to=to;
a[cnt].next=head[from];
head[from]=cnt;
}
bool dfs(int u)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
if(!finds[v])
{
finds[v]=1;
if(!belong[v]||dfs(belong[v]))
{
belong[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
b[x][y]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i%2==j%2&&!b[i][j])
{
l_cnt++;
for(int k=1;k<=8;k++)
{
x=i+dx[k];
y=j+dy[k];
if(x>0&&y>0&&x<=n&&y<=n&&!b[x][y])
{
r_cnt++;
add_edge(l_cnt,r_cnt);
}
}
}
r_cnt=n*n-l_cnt-m;
int ans=0;
for(int i=1;i<=l_cnt;i++)
{
memset(finds,0,sizeof(finds));
if(dfs(i))ans++;
}
cout<<l_cnt+r_cnt-ans;
}
P3355 骑士共存问题
使用的匈牙利,不管最后一个点能不能过,其他点都WA了一堆:
AC点为1 2 4