记录编号 149060 评测结果 EEEAEAEEEE
题目名称 [网络流24题] 骑士共存 最终得分 20
用户昵称 Gravatarnew ioer 是否通过 未通过
代码语言 C++ 运行时间 0.698 s
提交时间 2015-02-18 10:30:54 内存使用 8.89 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
bool map[201][201];
char ch[500000],*ptr=ch;
const int inf=0x3f3f3f3f;
int n,m,en,ans,len=1,d[40001],g[40001],p[400001],q[400001],pos[201][201];
struct edge{int to,next,cap;}e[400000];
const int dx[]={-2,-2,-1,-1,1,1,2,2},dy[]={1,-1,2,-2,2,-2,1,-1};
void in(int &x){
	x=0;while(*ptr<48) ptr++;
	while(*ptr>47) x=x*10+*ptr++-48;
}
void add(int x,int y,int z){
	e[++len].to=y,e[len].next=g[x],e[len].cap=z,g[x]=len;
	e[++len].to=x,e[len].next=g[y],e[len].cap=0,g[y]=len;
}
bool bfs(){
	int l=1,r=1;
    memset(d,0,sizeof d);
    q[1]=0,d[0]=1;
    while(l<=r){
        int x=q[l++];
        for(int to,i=g[x];i;i=e[i].next)
            if(!d[to=e[i].to]&&e[i].cap)
            	d[to]=d[x]+1,q[++r]=to;
    }
    return d[en];
}
int dfs(int x,int y){
    if(x==en||!y) return y;
    int flow=0,to,f;
    for(int &i=p[x];i;i=e[i].next){
        if(d[to=e[i].to]==d[x]+1&&e[i].cap){
            f=dfs(to,std::min(y,e[i].cap));
            flow+=f,y-=f;
            e[i].cap-=f,e[i^1].cap+=f;
            if(!y) break;
        }
    }
    return flow;
}
int main(){
	freopen("knight.in","r",stdin);
	freopen("knight.out","w",stdout);
	fread(ptr,1,500000,stdin);
	in(n),in(m),en=n*n+1,ans=n*n-m;
	for(int x,y;m;m--) in(x),in(y),map[x][y]=1;
	for(int k=0,i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			pos[i][j]=++k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			if(map[i][j]) continue;
			if(i+j&1){add(pos[i][j],en,1);continue;}
			add(0,pos[i][j],1);
			for(int u=0;u<8;u++){
				int x=i+dx[u],y=j+dy[u];
				if(x<=0||y<=0||x>n||y>n||map[x][y]) continue;
				add(pos[i][j],pos[x][y],1);
			}
		}
	while(bfs()){
		memcpy(p,g,sizeof p);
		ans-=dfs(0,inf);
	}
	printf("%d",ans);
}