旅人杜 @ 2018-11-08 17:03:56
代码如下
#include<cstdio>
#include<cstring>
using namespace std;
int ch[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,-1},{2,1},{-2,1},{-2,-1}};
struct node
{
int v;
int next;
}attack[400000];
int map[3000][3000],book[40005],match[40005],first[40005];
int n,m,cnt=1;
int dfs(int);
void add(int ,int);
int main()
{
scanf("%d%d",&n,&m);
int num=n*n-m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=0;
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
memset(first,-1,sizeof(first));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int t=map[i][j],q1,q2;
if(t==0)
{
for(int k=0;k<8;k++)
{
q1=i+ch[k][0];
q2=j+ch[k][1];
if(map[q1][q2]==0 and q1>=1 and q1<=n and q2>=1 and q2<=n)
add((i-1)*n+j,(q1-1)*n+q2);
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]==0)
{
memset(book,0,sizeof(book));
if(dfs((i-1)*n+j))
sum++;
}
printf("%d\n",num-sum/2);
return 0;
}
void add(int u,int v)
{
attack[cnt].v=v;
attack[cnt].next=first[u];
first[u]=cnt;
cnt++;
}
int dfs(int u)
{
for(int i=first[u];i!=-1;i=attack[i].next)
{
int w=attack[i].v;
if(book[w]==0)
{
book[w]=1;
if(match[w]==0 or dfs(match[w]))
{
match[w]=u;
return 1;
}
}
}
return 0;
}
by 天上一颗蛋 @ 2018-11-08 17:08:06
这题卡匈牙利
by 夕立 @ 2018-11-08 17:14:01
这题卡匈牙利poi
by TLE自动机 @ 2019-08-09 12:36:05
抱歉,DINIC跑二分图复杂度是