loj #6226. 「网络流 24 题」骑士共存问题
正文
#6226. 「网络流 24 题」骑士共存问题
题目描述
在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。
对于给定的 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击。
输入格式
第一行有两个正整数 n\text{n}n 和 m\text{m}m (1≤n≤200,0≤m≤n2−1)( 1 \leq n \leq 200, 0 \leq m \leq n^2 - 1 )(1≤n≤200,0≤m≤n2−1) 分别表示棋盘的大小和障碍数。
输出格式
输出计算出的共存骑士数。
样例
样例输入
3 2
1 1
3 3
样例输出
5
数据范围与提示
1≤n≤2001\leq n\leq 2001≤n≤200
0≤m≤n2−10 \leq m \leq n^2-10≤m≤n2−1
/* 加了当前弧优化和读入优化,快了不少 */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 40010 #define INF 1000000000 int n,m,head[maxn],dis[maxn],num=1,S,T,cur[maxn]; bool vis[maxn],mark[maxn]; struct node{int to,pre,v;}e[maxn*50]; using namespace std; int count(int x,int y){return n*(x-1)+y;} void Insert(int from,int to,int v){ e[++num].to=to;e[num].v=v;e[num].pre=head[from];head[from]=num; e[++num].to=from;e[num].v=0;e[num].pre=head[to];head[to]=num; } bool bfs(){ for(int i=S;i<=T;i++)dis[i]=-1,cur[i]=head[i]; queue<int>q; q.push(S);dis[S]=0; while(!q.empty()){ int now=q.front();q.pop(); for(int i=head[now];i;i=e[i].pre){ int to=e[i].to; if(e[i].v>0&&dis[to]==-1){ dis[to]=dis[now]+1; if(to==T)return 1; q.push(to); } } } return dis[T]!=-1; } int dinic(int x,int flow){ if(x==T||flow==0){return flow;} int rest=flow; for(int &i=cur[x];i;i=e[i].pre){ int to=e[i].to; if(dis[to]==dis[x]+1&&e[i].v>0){ int delta=dinic(to,min(rest,e[i].v)); e[i].v-=delta; e[i^1].v+=delta; rest-=delta; } } return flow-=rest; } bool check(int x,int y){ if(x<=n&&x>=1&&y<=n&&y>=1&&!mark[count(x,y)])return 1; return 0; } int qread(){ int i=0,j=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();} while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();} return i*j; } int main(){ n=qread();m=qread(); S=0,T=n*n+1; int x,y; for(int i=1;i<=m;i++){ x=qread();y=qread(); mark[count(x,y)]=1; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mark[count(i,j)])continue; if((i+j)&1){ Insert(S,count(i,j),1); if(check(i-1,j-2))Insert(count(i,j),count(i-1,j-2),1); if(check(i-1,j+2))Insert(count(i,j),count(i-1,j+2),1); if(check(i+1,j-2))Insert(count(i,j),count(i+1,j-2),1); if(check(i+1,j+2))Insert(count(i,j),count(i+1,j+2),1); if(check(i-2,j-1))Insert(count(i,j),count(i-2,j-1),1); if(check(i-2,j+1))Insert(count(i,j),count(i-2,j+1),1); if(check(i+2,j-1))Insert(count(i,j),count(i+2,j-1),1); if(check(i+2,j+1))Insert(count(i,j),count(i+2,j+1),1); } else Insert(count(i,j),T,1); } } int ans=0; while(bfs())ans+=dinic(S,INF); printf("%d",n*n-ans-m); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)