记录编号 195804 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 骑士共存 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 0.891 s
提交时间 2015-10-19 21:06:05 内存使用 6.68 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>

using namespace std;

int n,m;
int x,y,ans,z;
bool v[40010];
int sum,tot,first[40010];
int a[210][210],match[40010],zbd[40010];

struct Edge{
    int qd,zd,next;
}edge[500000];

void init()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        a[x][y]=-1;
    }
}

void add(int qd,int zd)
{
     edge[++tot].qd=qd;
     edge[tot].zd=zd;
     edge[tot].next=first[qd];
     first[qd]=tot;
}

void makegrafh()
{
     for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
             if(a[i][j]==0)
                 a[i][j]=++sum;
     for(int i=1;i<=n;i++){
         for(int j=0;j<i;j++){
            int x=i-j,y=i+j;
            if(x>0&&y<=n&&a[x][y]>0){
                zbd[++z]=a[x][y];
                if(x+2<=n){
                     if(y+1<=n&&a[x+2][y+1]>0)
                         add(a[x][y],a[x+2][y+1]);
                     if(y-1>0&&a[x+2][y-1]>0)
                         add(a[x][y],a[x+2][y-1]);
                }
                if(x-2>0){
                    if(y+1<=n&&a[x-2][y+1]>0)
                        add(a[x][y],a[x-2][y+1]);
                    if(y-1>0&&a[x-2][y-1]>0)
                       add(a[x][y],a[x-2][y-1]);
                }
                if(x-1>0){
                    if(y-2>0&&a[x-1][y-2]>0)
                        add(a[x][y],a[x-1][y-2]);
                    if(y+2<=n&&a[x-1][y+2]>0)
                        add(a[x][y],a[x-1][y+2]);
                }
                if(x+1<=n){
                    if(y-2>0&&a[x+1][y-2]>0)
                        add(a[x][y],a[x+1][y-2]);
                    if(y+2<=n&&a[x+1][y+2]>0)
                        add(a[x][y],a[x+1][y+2]);
                }
            }
            if(j!=0){
                x=i+j;y=i-j;
                if(x<=n&&y>0&&a[x][y]>0){
                    zbd[++z]=a[x][y];
                    if(x+2<=n){
                         if(y+1<=n&&a[x+2][y+1]>0)
                             add(a[x][y],a[x+2][y+1]);
                         if(y-1>0&&a[x+2][y-1]>0)
                             add(a[x][y],a[x+2][y-1]);
                    }
                    if(x-2>0){
                        if(y+1<=n&&a[x-2][y+1]>0)
                            add(a[x][y],a[x-2][y+1]);
                        if(y-1>0&&a[x-2][y-1]>0)
                           add(a[x][y],a[x-2][y-1]);
                    }
                    if(x-1>0){
                        if(y-2>0&&a[x-1][y-2]>0)
                            add(a[x][y],a[x-1][y-2]);
                        if(y+2<=n&&a[x-1][y+2]>0)
                            add(a[x][y],a[x-1][y+2]);
                    }
                    if(x+1<=n){
                        if(y-2>0&&a[x+1][y-2]>0)
                            add(a[x][y],a[x+1][y-2]);
                        if(y+2<=n&&a[x+1][y+2]>0)
                            add(a[x][y],a[x+1][y+2]);
                    }
                }
            }
         }
     }
}

bool dfs(int x)
{
     for(int i=first[x];i;i=edge[i].next){
         int zd=edge[i].zd;
         if(!v[zd]){
             v[zd]=1;
             if(!match[zd]||dfs(match[zd])){
                  match[zd]=x;
                  return true;
             }
         }
     }
     return false;
}

int main()
{
    freopen("knight.in","r",stdin);
	freopen("knight.out","w",stdout);
    init();makegrafh();
    for(int i=1;i<=z;i++){
        memset(v,0,sizeof(v));
        if(dfs(zbd[i]))ans++;
    }
    printf("%d",sum-ans);
}