三体智子 @ 2018-04-22 21:42:34
评测时30分,但查不出错误。。。
请问大佬,代码哪里wa了?(来自蒟蒻的凝望)
#include<cstdio>
#include<cstring>
int n,m,st,ed;
struct nod1{int hou,v;} a[810000];
struct nod2{int x,y,c,gg,f;} b[810000];
int len=0; int li[810000];
int num[2100][2100];
bool f[2100][2100];
int dx[8]={-2,-2,-1,1,2,2,1,-1};
int dy[8]={-1,1,2,2,1,-1,-2,-2};
void ins(int x,int y,int c)
{
int k1,k2;
len++; k1=len;
b[len].x=x; b[len].y=y; b[len].c=c;
b[len].gg=a[x].hou; a[x].hou=len;
len++; k1=len;
b[len].x=y; b[len].y=x; b[len].c=0;
b[len].gg=a[y].hou; a[y].hou=len;
b[k1].f=k2;
b[k2].f=k1;
}
bool bfs()
{
memset(li,0,sizeof(li));
for(int i=1;i<=ed;i++) a[i].v=0;
int tou=1,wei=2;
li[tou]=st; a[st].v=1;
while(tou<wei)
{
int x=li[tou];
for(int i=a[x].hou;i>0;i=b[i].gg)
{
int y=b[i].y;
if(b[i].c>0 && a[y].v==0)
{
li[wei++]=y;
a[y].v=a[x].v+1;
}
}
tou++;
}
if(a[ed].v==0) return false;
return true;
}
int minn(int x,int y) { return x<y?x:y; }
int dfs(int x,int k)
{
if(x==ed) return k;
int t=0,ff;
for(int i=a[x].hou;i>0;i=b[i].gg)
{
int y=b[i].y;
if(b[i].c>0 && t<k && a[y].v==a[x].v+1)
{
ff=dfs( y, minn(k-t,b[i].c) );
t+=ff; b[i].c-=ff; b[b[i].f].c+=ff;
}
}
if(t==0) a[x].v=0;
return t;
}
int main()
{
memset(f,true,sizeof(f));
scanf("%d %d",&n,&m);
st=n*n+1; ed=st+1;
int sum=0;
int num1=0;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) num1++,num[i][j]=num1;
sum+=n*n-m;
for(int i=1;i<=m;i++)
{
int x,y; scanf("%d %d",&x,&y);
f[x][y]=false;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(f[i][j]==false) continue;
int id=num[i][j];
if((i+j)%2==0) //黄色
{
ins(st,id,1);
for(int k=0;k<=7;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x<=0 || x>n || y<=0 || y>n || !f[x][y]) continue;
ins(id,num[x][y],999999999);
}
}
else ins(id,ed,1);
}
}
int ans=0;
while(bfs())
{
ans+=dfs(st,2147483647);
// printf("sum=%d\n",ans);
}
printf("%d",sum-ans);
return 0;
}
/*
5 1
3 3
12
*/