玄学代码。。。

P3355 骑士共存问题

三体智子 @ 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
*/

|