题目描述

众所周知,马后炮是中国象棋中很厉害的一招必杀技。"马走日字"。本来,如果在要去的方向有别的棋子挡住(俗
称"蹩马腿"),则不允许走过去。为了简化问题,我们不考虑这一点。马跟马显然不能在一起打起来,于是rly在
一天再次借来了许多许多的马在棋盘上摆了起来……但这次,他实在没兴趣算方案数了,所以他只想知道在N×M的
矩形方格中摆马使其互不吃到的情况下的最多个数。但是,有一个很不幸的消息,rly由于玩得太Happy,质量本来
就不好的棋盘被rly弄坏了,不过幸好只是破了其中的一些格子(即不能再放子了),问题还是可以继续解决的。

输入

一行,两个正整数N和M。
接下来N行,每行M个数,要么为0,表示没坏,要么为1,表示坏了。
N<=200,M<=200

输出

一行,输出最多的个数。

样例输入

2 3
0 1 0
0 1 0

样例输出

2
  这道题和BZOJ3175是一样的题,黑白染色之后跑二分图最大匹配,用矩阵大小-1的数目-二分图最大匹配数。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int next[1000001];
int to[1000001];
int val[1000001];
int head[1000001];
int tot=1;
int q[1000001];
int n,k,m;
int S,T;
int ans;
int x,y;
int d[1000001];
int c[1001][1001];
const int dx[]={-2,-1,1,2,2,1,-1,-2};
const int dy[]={1,2,2,1,-1,-2,-2,-1};
void add(int x,int y,int v)
{tot++;next[tot]=head[x];head[x]=tot;to[tot]=y;val[tot]=v;tot++;next[tot]=head[y];head[y]=tot;to[tot]=x;val[tot]=0;
}
bool bfs(int S,int T)
{int r=0;int l=0;memset(q,0,sizeof(q));memset(d,-1,sizeof(d));q[r++]=S;d[S]=0;while(l<r){  int now=q[l];for(int i=head[now];i;i=next[i]){if(d[to[i]]==-1&&val[i]!=0){d[to[i]]=d[now]+1;q[r++]=to[i];}}l++;}if(d[T]==-1){return false;}else{return true;}
}
int dfs(int x,int flow)
{if(x==T){return flow;}int now_flow;int used=0;for(int i=head[x];i;i=next[i]){if(d[to[i]]==d[x]+1&&val[i]!=0){now_flow=dfs(to[i],min(flow-used,val[i]));val[i]-=now_flow;val[i^1]+=now_flow;used+=now_flow;if(now_flow==flow){return flow;}}}if(used==0){d[x]=-1;}return used;
}
void dinic()
{while(bfs(S,T)==true){ans+=dfs(S,0x3f3f3f);}
}
int main()
{scanf("%d%d",&n,&m);S=n*m+16;T=n*m+28;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&c[i][j]);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(c[i][j]==0){c[i][j]=(i-1)*m+j;if((i+j)%2==0){add(S,c[i][j],1);}else{add(c[i][j],T,1);}}else{k++;c[i][j]=-1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(c[i][j]!=-1&&(i+j)%2==0){for(int l=0;l<=7;l++){int fx=dx[l]+i;int fy=dy[l]+j;if(fx>0&&fx<=n&&fy>0&&fy<=m&&c[fx][fy]!=-1){add(c[i][j],c[fx][fy],0x3f3f3f);} }}}}dinic();printf("%d",n*m-k-ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9301740.html

BZOJ4808马——二分图最大独立集相关推荐

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

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

  2. [BZOJ4808] 马(最大独立集,最大流)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4808 题意:其实就是找出一个点集的子集,使得这个子集中的点互不相连.求这个子集规模最大. ...

  3. [二分图最大独立集] bzoj4808 马

    bzoj4808 马:http://www.lydsy.com/JudgeOnline/problem.php?id=4808 把每个点和他所有能到达的点相连 最大独立集=总点数-最小覆盖集=总点数- ...

  4. [二分图最大独立集] BZOJ4808:马

    棋盘01染色,然后把互相能打到的点连边,发现是个二分图. 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手- #include<cstdio> #include<que ...

  5. 洛谷 - P3355 骑士共存问题(二分图最大独立集)

    题目链接:点击查看 题目大意:给出一个n*n的棋盘,上面有m个点无法放置棋子,现在要求尽可能多的放 马,使得所有的马两两无法互相攻击,题目要求输出可以放置的最大数量 题目分析:二分图最大独立集的裸题, ...

  6. CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,有t个点是禁止放棋子的,现在按照马走日的规则,问在互不影响的情况下最多能放多少个马 题目分析:这里首先简单介绍一下二分图最大独立集的定义: 通俗来讲 ...

  7. BZOJ4808: 马

    BZOJ4808: 马 https://lydsy.com/JudgeOnline/problem.php?id=4808 分析: 黑白染色,求二分图最大匹配即可. 代码: #include < ...

  8. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  9. 【二分图最大独立集】BZOJ4808[马]题解

    题目概述 给出 n×mn\times m 的棋盘(有些位置有损坏),问最多能在其中放多少互不吃到的马(不能放在损坏位置中). 解题报告 NOIP2017前的最后一题QAQ. 首先将棋盘 0101 间隔 ...

最新文章

  1. jQuery 遍历 - closest() 方法
  2. Windows下配置单机Hadoop环境
  3. java异常——分析堆栈跟踪元素+使用异常机制的技巧
  4. FICO蓝图设计-专题方案-财务组织架构
  5. 分割字符串s使得每个子串都是回文串
  6. c语言指针慕课,C语言指针
  7. mediawiki 编辑php代码,mediawiki_1.25配置wikieditor编辑器
  8. (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
  9. 小程序毫秒级倒计时(适用于拼团秒杀功能)
  10. android中使用setVideoURI()播放视频
  11. LiveLinkFce的Arkit与Character Creator动画曲线的对接
  12. Hash算法原理的简单分析
  13. 2019运输科技领域最新SCI期刊影响因子正式发布,附三年IF变化趋势!
  14. 网络协议和标准——IEEE802
  15. transform: translateY(-100%)偏移实现上滑隐藏导航栏
  16. 计算机桌面应用程序图标不见了怎么办,桌面程序图标不见了,桌面软件快捷方式不见了怎么办?...
  17. 10-STM32F1-RTC and BKP
  18. 【调剂】河南财经政法大学2021年接受调剂专业
  19. 【Buzz】离线语音转文字、实时语音识别
  20. 用c语言写一个唐诗的程序,文言文编程95后又出新作,在287051行古诗中找出了“唐诗幻方”!...

热门文章

  1. Linux下内存压力测试工具memtest(使用心得)
  2. XeLaTeX: 支持现代字体 LaTeX 编译器
  3. 《非暴力沟通》思维导图
  4. ubuntu20.04更换清华源
  5. 计算机真题训练6word上机题,Micrsoft Office Word上机练习题集.docx
  6. 二叉树前中后序遍历以及节点计算
  7. Windows的此版本即將過期
  8. 《离散数学及其应用》读书笔记【三】计数
  9. Busuanzi网站统计失效问题
  10. 私服github开源项目