题面

以前写过的题,翻出来学习网络流写二分图匹配,因为复杂度更优秀,$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 马相关推荐

  1. BZOJ 4808(马-二分图最大独立集)

    4808: 马 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 111 Solved: 46 [Submit][Status][Discuss] Des ...

  2. BZOJ 4808: 马(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4808 题意: 思路: 这图中的两个马只能选一个,二选一,很像二分图吧,对能互吃的两个棋子连线,在所选 ...

  3. bzoj 4808: 马

    题意: 在图上放最多马,使它们不能相互攻击. 题解: 同bzoj 攻击装置.3175 一开始狂T,抄了个偏移量竟然快了10几倍? 玄学-- code: #include<cstdio> # ...

  4. [bzoj 4808]马

    众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿"),则不允许走过去.为了简化问题,我们不考虑这 ...

  5. bzoj 4808: 马【匈牙利算法】

    网格图黑白染色,然后能互相攻击到的点之间连边,跑匈牙利算法最大匹配,答案是好点个数-最大匹配(最大独立集) 注意pao的时候只从一种颜色的格子统计即可 #include<iostream> ...

  6. BZOJ 4808 二分图最大点独立集

    4808: 马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗 称"蹩马腿"), ...

  7. [BZOJ 1193] 马步距离

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1193 Solution: 能立刻看出贪心算法,但发现在小数据时明显不适用 于是我们采取大 ...

  8. BZOJ P4808 马

    又是一道水题,直接黑白点染色建一个二分图然后求一个最大点独立集即可 代码不给了 话说这一堆系列题怎么都是只改了一下题面啊,尴尬

  9. BZOJ 4808 二分图最大独立集

    思路: 棋盘是个二分图 那就把一个可以走的白点  向所有可以走的黑点连边 跑一个最大匹配   (匹配上了就代表这两个点不能共存) 最大独立集=sum-最大匹配 //By SiriusRen #incl ...

最新文章

  1. 查被占用的端口号由哪个程序运行
  2. OpenStack概念架构简述
  3. linux之学习linux系统相关的书籍
  4. 38. 统计一个整数的二进制表示中bit为1的个数
  5. ftp用的是tcp还是udp_TCP与UDP的区别究竟在哪
  6. 机房巡检知识点(一)
  7. 绿幕抠图支持网页、PPT背景类型
  8. 新买的联想笔记本计算机选项,怎么我的计算机一开机全部都是雪花
  9. 深入剖析DHCP服务IP地址自动分配原理
  10. 计算机通信与信息系统教学,通信与信息系统学科学术型硕士研究生培养方案
  11. python jpg压缩_python 实现图片批量压缩的示例
  12. Flash Timeout.Reset the Target and try it again 报错解决方案 STM32 ST-LINK Utility下载程序操作
  13. 怎么通过外网来访问自己在Tomcat服务器中配置的项目
  14. KICAD设计——导出文件
  15. 恋爱戒律 女生必读的恋爱技巧
  16. 大学生就业咨询系统数据库设计
  17. Xilinx zynq USB开发
  18. 从无到有的FTP(读书百遍其义自见)
  19. 【腾讯云原生降本增效大讲堂】Kubernetes云上资源的分析与优化
  20. 2019外国人缴税计算机_机器人应该纳税吗

热门文章

  1. 双11前夕,阿里启用机房巡检机器人、京东加了2000+台服务器!这下你们可以放心剁手了...
  2. catia参数化建模时在结构树中不显示参数信息
  3. python 批量移动文件
  4. 任正非:总有一天我们会反攻进入美国
  5. Matlab中将行向量转为列向量的方法
  6. linux源代码哪里下载,Redhat的源代码在哪里下载
  7. matlab 微分命令 求导,Matlab微分和积分
  8. “破产清算”的拉夏贝尔,不会是最后一个
  9. 【MySQL】MySQL复制原理与主备一致性同步工作原理解析(原理篇)(MySQL专栏启动)
  10. 线性代数学习笔记6-1:行列式与线性变换