网络流24题-骑士共存问题
骑士共存问题
时空限制1000ms / 128MB
题目描述
在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入
对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击
输入输出格式
输入格式:
第一行有 2 个正整数n 和 m (1<=n<=200, 0<=m<n2),分别表示棋盘的大小和障碍数。接下来的 m 行给出障碍的位置。每行 2 个正整数,表示障碍的方格坐标。
输出格式:
将计算出的共存骑士数输出
输入输出样例
3 2 1 1 3 3
5
说明
题目链接:https://www.luogu.org/problemnew/show/P3355
这一题和方格取数问题思路是一样的。当时我还没学二分图最大点权独立集,所以强行理解了一波最小割(emmmm)。如果对图进行黑白染色,使白格只与黑格相邻,黑格只与白格相邻,则观察发现任何互相冲突的两个骑士一定属于不同颜色的格子,于是这题就变成了很裸的二分图最大点权独立集。
#include<bits/stdc++.h> #define INF LLONG_MAX/2 #define N 40050 using namespace std;struct ss {int v,next;long long flow; }; int head[N],now_edge=0,S,T; ss edg[N*32];void init() {now_edge=0;memset(head,-1,sizeof(head)); }void addedge(int u,int v,long long flow) {edg[now_edge]=(ss){v,head[u],flow};head[u]=now_edge++;edg[now_edge]=(ss){u,head[v],0};head[v]=now_edge++; }int dis[N];int bfs() {memset(dis,0,sizeof(dis));queue<int>q;q.push(S);dis[S]=1;while(!q.empty()){int now=q.front();q.pop();for(int i=head[now];i!=-1;i=edg[i].next){ss &e=edg[i];if(e.flow>0&&dis[e.v]==0){dis[e.v]=dis[now]+1;q.push(e.v);}}}if(dis[T]==0)return 0;return 1; }int current[N]; long long dfs(int x,long long maxflow) {if(x==T)return maxflow;for(int i=current[x];i!=-1;i=edg[i].next){current[x]=i;ss &e=edg[i];if(e.flow>0&&dis[e.v]==dis[x]+1){long long flow=dfs(e.v,min(maxflow,e.flow));if(flow!=0){e.flow-=flow;edg[i^1].flow+=flow;return flow;}}}return 0; }long long dinic() {long long ans=0,flow;while(bfs()){for(int i=0;i<N;i++)current[i]=head[i];while(flow=dfs(S,INF))ans+=flow;}return ans; }int color[205][205]={0}; int num[205][205]; int Map[205][205]={0}; int n;int check(int x,int y) {if(x<=0||x>n||y<=0||y>n||Map[x][y])return 0;return 1; }int fx[10]={-2,-2,-1,1,2,2,1,-1}; int fy[10]={-1,1,2,2,1,-1,-2,-2};int main() {init();int m,cnt=1;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)num[i][j]=cnt++;S=cnt;T=S+1;for(int i=1;i<=n;i++)for(int j=(i%2==0 ? 2 : 1);j<=n;j+=2)color[i][j]=1;/* for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%d",color[i][j]);printf("\n");}*/for(int i=1;i<=m;i++){int x,y;scanf("%d %d",&x,&y);Map[x][y]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!Map[i][j]&&color[i][j]){for(int k=0;k<8;k++)if(check(i+fx[k],j+fy[k])){addedge(num[i][j],num[i+fx[k]][j+fy[k]],INF);}}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!Map[i][j]){if(color[i][j])addedge(S,num[i][j],1);elseaddedge(num[i][j],T,1);}printf("%lld\n",(long long)n*n-dinic()-m);return 0;}
View Code
转载于:https://www.cnblogs.com/tian-luo/p/9721302.html
网络流24题-骑士共存问题相关推荐
- [COGS746] [网络流24题] 骑士共存
★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比 时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上 ...
- 网络流24题-骑士共存
题目点这里 题目or在这里 题意就略过了 现将棋盘黑白染色 建立超级源(s)和超级汇(t) edge(s,黑,1) edge(白,t,1) edge(黑,白,1) 考虑s->黑->白-&g ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...
- [网络流24题][CODEVS1922]骑士共存问题(最大流)
问题描述 传送门 题解 首先介绍ATP神犇的做法: 和方格取数3几乎一样,黑白染色,可以发现能攻击到的点颜色不同. 那么从超级源向每一个黑点连边,容量为1,从每一个白点向超级汇连边,容量为1:从黑点向 ...
- 解题报告:线性规划与网络流24题
目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...
- 「网络流24题」 题目列表
「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- 【题解】网络流24题一句话题解集合
最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...
- cwl的网络流24题练习
网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题 3 最小路径覆盖问题 有向图最小路径覆盖,解法都写题目上了 4 魔术球问题 有向图最 ...
- 【线性规划和网络流24题】
(1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...
最新文章
- 青少年编程竞赛交流群周报(第038周)
- PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
- 前端技术分享:什么是MongoDB数据库?
- 弹性服务器架构-连接一切的力量
- yum 安装报Header V3 DSA signature: NOKEY 的错
- python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法
- 5个能提高你工作效率的Excel技巧
- DPDK-VPP 学习笔记-01
- python爬取西刺网代理IP地址
- edius裁剪快捷键_edius常用的快捷键有哪些-怎么设置快捷键-edius快捷键使用大全...
- golang常量与逻辑运算基本语法
- BZOJ 3505: [Cqoi2014]数三角形|组合数学
- 阿里云虚拟机转让(RAM创建账户)
- 快速合并多个文件内容到一个文件中
- hMailServer设置
- 数据挖掘:探索性数据分析(EDA)
- MathML: 描述数学表达式
- 完全背包问题(动态规划)
- C# 写入和读取TXT文件
- 游玩3ds游戏的N种方法