问题描述

传送门

题解

首先介绍ATP神犇的做法:
和方格取数3几乎一样,黑白染色,可以发现能攻击到的点颜色不同。
那么从超级源向每一个黑点连边,容量为1,从每一个白点向超级汇连边,容量为1;从黑点向每一个能攻击到的白点连边,容量为INF。那么答案即为点数-最小割(障碍点不进入建图,点数为总点数减去障碍点数)。
其实有这个思路的充要条件是原题的图(原题图中已经贴心地为你染好了色),然后很快就能发现黑白染色的结论。然而CODEVS坑爹的没有图,ATP神犇打开了【线性规划与网络流24题】看到了原图,于是我这个穷人家的孩子没有图,,,就想出了一个十分奇怪的思路:
首先拆点,从超级源向每一个点(除去障碍)连边,容量为1,再将每一个点(除障碍)向超级汇连边,容量为1;然后从左边一排点向右边它能攻击到的点(除障碍)连边,容量为INF。这样,我们求出了最小割。
等等,这好像割重了吧。。。没错,双方必须都不连通,那么每一对点割了两次,于是答案为点数-maxflow/2。
其实以上两种思想大同小异,都是将互斥关系转化成最小割来求解。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;const int max_n=205;
const int max_N=max_n*max_n*2+2;
const int max_m=1e6;
const int max_e=max_m*2;
const int INF=1e9;int sx[8]={1,1,-1,-1,2,2,-2,-2};
int sy[8]={2,-2,2,-2,1,-1,1,-1};
int n,m,N,x,y,loc,loc1,sum,maxflow;
bool cant[max_n][max_n];
int tot,point[max_N],next[max_e],v[max_e],remain[max_e];
int deep[max_N],last[max_N],cur[max_N],num[max_N];
queue <int> q;inline void addedge(int x,int y,int cap){++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap;++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;
}inline void bfs(int t){for (int i=1;i<=N;++i)deep[i]=N;deep[t]=0;for (int i=1;i<=N;++i)cur[i]=point[i];while (!q.empty()) q.pop();q.push(t);while (!q.empty()){int now=q.front(); q.pop();for (int i=point[now];i!=-1;i=next[i])if (deep[v[i]]==N&&remain[i^1]){deep[v[i]]=deep[now]+1;q.push(v[i]);}}
}inline int addflow(int s,int t){int ans=INF,now=t;while (now!=s){ans=min(ans,remain[last[now]]);now=v[last[now]^1];}now=t;while (now!=s){remain[last[now]]-=ans;remain[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}inline void isap(int s,int t){bfs(t);for (int i=1;i<=N;++i)++num[deep[i]];int now=s;while (deep[s]<N){if (now==t){maxflow+=addflow(s,t);now=s;}bool has_find=false;for (int i=cur[now];i!=-1;i=next[i])if (deep[v[i]]+1==deep[now]&&remain[i]){has_find=true;cur[now]=i;last[v[i]]=i;now=v[i];break;}if (!has_find){int minn=N-1;for (int i=point[now];i!=-1;i=next[i])if (remain[i])minn=min(minn,deep[v[i]]);if (!(--num[deep[now]])) break;num[deep[now]=minn+1]++;cur[now]=point[now];if (now!=s)now=v[last[now]^1];}}
}int main(){tot=-1;memset(point,-1,sizeof(point));memset(next,-1,sizeof(next));scanf("%d%d",&n,&m);N=n*n*2+2;sum=n*n;for (int i=1;i<=m;++i){scanf("%d%d",&x,&y);cant[x][y]=true;--sum;}for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)if (!cant[i][j]){loc=(i-1)*n+j;addedge(1,1+loc,1);addedge(1+n*n+loc,N,1);for (int k=0;k<8;++k){int nowx=i+sx[k]; int nowy=j+sy[k];if (nowx<=0||nowx>n||nowy<=0||nowy>n||cant[nowx][nowy]) continue;loc1=(nowx-1)*n+nowy;addedge(1+loc,1+n*n+loc1,INF);}}isap(1,N);printf("%d\n",sum-maxflow/2);
}

总结

①马跳日字,坐标注意。

[网络流24题][CODEVS1922]骑士共存问题(最大流)相关推荐

  1. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  2. 【网络流24题】圆桌聚餐(最大流)

    [网络流24题]圆桌聚餐(最大流) 题面 Cogs 题解 这道题很简单 首先每个单位的人数限制 直接从源点向单位连边,容量为人数 同样的, 每个桌子向汇点连边,容量为可以坐的人数 因为每个桌子只能够做 ...

  3. SSL-ZYC P2624 (洛谷P3355)【24题】骑士共存问题

    题目大意: 思路: 这题是真的烦... n<=200的数据很容易让我们想到匈牙利算法,所以就打了一发匈牙利. 然后T了... 于是就开始优化. 优化了我2个小时... 正题: 匈牙利算法(二分图 ...

  4. 【网络流24题】搭配飞行员(最大流+二分图匹配)

    传送门 搭配飞行员     题意:二分图匹配裸题,不多说 I think Dinic算法跑最大流解决||匈牙利算法 Code 代码一:Dinic #include<cstdio> #inc ...

  5. 【网络流24题】圆桌聚餐 (最大流)

    题意 假设有来自 nn n 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 riri r_i ​​.会议餐厅共有 mm m 张餐桌,每张餐桌可容纳 cici c_i​​ 个代表就餐. 为了使 ...

  6. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  7. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  8. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  9. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

最新文章

  1. 用c语言写一个两线程程序,如何用C语言实现多线程
  2. 如何在mac版本的python里安装pip
  3. 大数据职业理解_到底什么是大数据,大数据职业的具体工作内容是什么?
  4. 【HDU - 2717】【POJ - 3278】Catch That Cow (经典bfs,类似dp)
  5. python类中包含一个特殊的变量、它可以访问类的成员_Python 类的特殊成员介绍...
  6. linux重定向文件容加时间,linux – Shell重定向和文件I / O持续时间
  7. 正点原子 STM32芯片解读 M3_Bath
  8. 相控阵基础之3-阵列码间串扰
  9. iOS崩溃日志ips文件解析
  10. SQLServer2019 如何导出单张表数据
  11. c语言数组文曲星猜数游戏编程,第7章 数组-8数组的其他应用——文曲星猜数游戏...
  12. 如何防止木马性图片上传
  13. 社区发现算法——(Spectral Clustering)谱聚类算法
  14. Win系统 - 系统双击文件总弹出属性窗口如何解决?
  15. asterisk拨号规则
  16. [原创]gsoap的基本使用方法『C++web服务工具包』
  17. 关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)
  18. 【转载】纳兰性德的诗词全集
  19. 《测试架构师的修炼之道》七—测试策略实战
  20. 中医测试体质的软件,中医体质测试系统,中医九种体质测试,在线测试中医体质,中医体质自测...

热门文章

  1. Python实现Excel改为txt格式
  2. Android上传文件到Web服务器,PHP接收文件(一)
  3. 【ESP 保姆级教程】玩转巴法云篇③ —— TCP创客云,TCP协议下的数据通信
  4. 长沙云图丨VR全景项目真是的风口吗?
  5. asr语音转写_语音识别(ASR)--语音转文字
  6. android微信hook过滤检测,基于Xposed hook 实时监测微信消息
  7. [ARX].NET开发AutoCAD2006指南
  8. Mysql安装流程(详细图文翻译解释)
  9. 2022年湖北省第六批国家级非物质文化遗产代表性传承人推荐申报范围、名额和申报标准、材料
  10. 2022年全球及中国公路自行车行业头部企业市场占有率及排名调研报告