解题:BZOJ 4808 马
题面
以前写过的题,翻出来学习网络流写二分图匹配,因为复杂度更优秀,$Dinic$是$O(sqrt(n)m)$哒~
原点向左部点连流量为$1$的边,左部点向对应右部点连流量为$1$的边,右部点向汇点连流量为$1$的边,然后跑
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int B=205,N=40005,M=320005,inf=1e9; 6 const int mov[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}}; 7 int T,n,m,s,t,f,b,t1,t2,rd,num,cnt,tot,ans; 8 int noww[2*M],goal[2*M],flow[2*M]; 9 int p[N],pp[N],dep[N],que[N]; 10 int bro[B][B],mapp[B][B]; 11 int tonum(int x,int y) 12 { 13 return (x-1)*m+y; 14 } 15 bool check(int x,int y) 16 { 17 return x>=1&&x<=n&&y>=1&&y<=m; 18 } 19 void link(int f,int t,int v) 20 { 21 noww[++cnt]=p[f],p[f]=cnt; 22 goal[cnt]=t,flow[cnt]=v; 23 noww[++cnt]=p[t],p[t]=cnt; 24 goal[cnt]=f,flow[cnt]=0; 25 } 26 bool Layering(int st,int ed) 27 { 28 for(int i=1;i<=num;i++) pp[i]=p[i]; 29 memset(dep,-1,sizeof dep); 30 dep[st]=0,que[f=b=0]=st; 31 while(f<=b) 32 { 33 int tn=que[f++]; 34 for(int i=p[tn];i;i=noww[i]) 35 if(dep[goal[i]]==-1&&flow[i]) 36 dep[goal[i]]=dep[tn]+1,que[++b]=goal[i]; 37 } 38 return ~dep[ed]; 39 } 40 int Augmenting(int nd,int ed,int mn) 41 { 42 if(nd==ed||!mn) return mn; 43 int tmp=0,tep=0; 44 for(int i=pp[nd];i;i=noww[i]) 45 { 46 pp[nd]=i; 47 if(dep[goal[i]]==dep[nd]+1) 48 if(tep=Augmenting(goal[i],ed,min(mn,flow[i]))) 49 { 50 flow[i]-=tep,mn-=tep; 51 flow[i^1]+=tep,tmp+=tep; 52 if(!mn) break; 53 } 54 } 55 return tmp; 56 } 57 void Dinic_Maxflow(int st,int ed) 58 { 59 while(Layering(st,ed)) 60 ans+=Augmenting(st,ed,inf); 61 } 62 int main () 63 { 64 scanf("%d%d",&n,&m); 65 cnt=1,num=n*m+2,tot=n*m,s=n*m+1,t=n*m+2; 66 for(int i=1;i<=n;i++) 67 for(int j=1;j<=m;j++) 68 { 69 scanf("%d",&rd); 70 bro[i][j]=rd,tot-=rd; 71 } 72 for(int i=1;i<=n;i++) 73 for(int j=1;j<=m;j++) 74 if(!bro[i][j]) 75 { 76 if((i^j)&1) 77 { 78 link(s,tonum(i,j),1); 79 for(int k=0;k<8;k++) 80 { 81 t1=i+mov[k][0],t2=j+mov[k][1]; 82 if(check(t1,t2)&&!bro[t1][t2]) 83 link(tonum(i,j),tonum(t1,t2),1); 84 } 85 } 86 else link(tonum(i,j),t,1); 87 } 88 Dinic_Maxflow(s,t); 89 printf("%d",tot-ans); 90 return 0; 91 } 92
View Code
转载于:https://www.cnblogs.com/ydnhaha/p/10046737.html
解题:BZOJ 4808 马相关推荐
- BZOJ 4808(马-二分图最大独立集)
4808: 马 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 111 Solved: 46 [Submit][Status][Discuss] Des ...
- BZOJ 4808: 马(二分图最大点独立集)
http://www.lydsy.com/JudgeOnline/problem.php?id=4808 题意: 思路: 这图中的两个马只能选一个,二选一,很像二分图吧,对能互吃的两个棋子连线,在所选 ...
- bzoj 4808: 马
题意: 在图上放最多马,使它们不能相互攻击. 题解: 同bzoj 攻击装置.3175 一开始狂T,抄了个偏移量竟然快了10几倍? 玄学-- code: #include<cstdio> # ...
- [bzoj 4808]马
众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿"),则不允许走过去.为了简化问题,我们不考虑这 ...
- bzoj 4808: 马【匈牙利算法】
网格图黑白染色,然后能互相攻击到的点之间连边,跑匈牙利算法最大匹配,答案是好点个数-最大匹配(最大独立集) 注意pao的时候只从一种颜色的格子统计即可 #include<iostream> ...
- BZOJ 4808 二分图最大点独立集
4808: 马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗 称"蹩马腿"), ...
- [BZOJ 1193] 马步距离
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1193 Solution: 能立刻看出贪心算法,但发现在小数据时明显不适用 于是我们采取大 ...
- BZOJ P4808 马
又是一道水题,直接黑白点染色建一个二分图然后求一个最大点独立集即可 代码不给了 话说这一堆系列题怎么都是只改了一下题面啊,尴尬
- BZOJ 4808 二分图最大独立集
思路: 棋盘是个二分图 那就把一个可以走的白点 向所有可以走的黑点连边 跑一个最大匹配 (匹配上了就代表这两个点不能共存) 最大独立集=sum-最大匹配 //By SiriusRen #incl ...
最新文章
- 查被占用的端口号由哪个程序运行
- OpenStack概念架构简述
- linux之学习linux系统相关的书籍
- 38. 统计一个整数的二进制表示中bit为1的个数
- ftp用的是tcp还是udp_TCP与UDP的区别究竟在哪
- 机房巡检知识点(一)
- 绿幕抠图支持网页、PPT背景类型
- 新买的联想笔记本计算机选项,怎么我的计算机一开机全部都是雪花
- 深入剖析DHCP服务IP地址自动分配原理
- 计算机通信与信息系统教学,通信与信息系统学科学术型硕士研究生培养方案
- python jpg压缩_python 实现图片批量压缩的示例
- Flash Timeout.Reset the Target and try it again 报错解决方案 STM32 ST-LINK Utility下载程序操作
- 怎么通过外网来访问自己在Tomcat服务器中配置的项目
- KICAD设计——导出文件
- 恋爱戒律 女生必读的恋爱技巧
- 大学生就业咨询系统数据库设计
- Xilinx zynq USB开发
- 从无到有的FTP(读书百遍其义自见)
- 【腾讯云原生降本增效大讲堂】Kubernetes云上资源的分析与优化
- 2019外国人缴税计算机_机器人应该纳税吗
热门文章
- 双11前夕,阿里启用机房巡检机器人、京东加了2000+台服务器!这下你们可以放心剁手了...
- catia参数化建模时在结构树中不显示参数信息
- python 批量移动文件
- 任正非:总有一天我们会反攻进入美国
- Matlab中将行向量转为列向量的方法
- linux源代码哪里下载,Redhat的源代码在哪里下载
- matlab 微分命令 求导,Matlab微分和积分
- “破产清算”的拉夏贝尔,不会是最后一个
- 【MySQL】MySQL复制原理与主备一致性同步工作原理解析(原理篇)(MySQL专栏启动)
- 线性代数学习笔记6-1:行列式与线性变换