(上不了p站我要死了,侵权度娘背锅)

Description

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

Input

一行,两个正整数N和M。

接下来N行,每行M个数,要么为0,表示没坏,要么为1,表示坏了。

N<=200,M<=200

Output

一行,输出最多的个数。

Sample Input

2 3

0 1 0

0 1 0

Sample Output

2

算是一道裸题了吧

为了二分图练手以及多见一些二分图的性质

网格图是天然的二分图(当然并不是网格图就一定是二分图的题),将网格交替染色,则发现马的走法一定是从黑到白(或从白到黑)。那么这就是求互不可达的马的数量,即 最大点独立集

下面来感性证明一下 最大点独立集=点数-最小点覆盖(最大匹配):



用最少的点覆盖完了所有的边,那么如果我们删去这些属于最大匹配的点(边的一端),则剩下的点就不会和其他点相邻。如果还与别的点相邻,就说明这其实还是一个匹配,那么之前的匹配就不是最大匹配了。

1A代码(写的好丑):

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std; template <typename T>inline void read(T &res){
T k=1,x=0;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-')k=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
res=x*k;
} const int N=205; int n,m,c[N][N];
int head[N*N],to[N*N*8],nxt[N*N*8],hh=0;
int tot=0,cnt=0;
int bl[N*N];
bool vis[N*N]; void adde(int a,int b){
hh++;
to[hh]=b;
nxt[hh]=head[a];
head[a]=hh;
}
bool find(int u){
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(vis[v]) continue;
vis[v]=1;
if(bl[v]==0||find(bl[v])){
bl[v]=u;
return true;
}
}
return false;
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
read(c[i][j]);
if(!c[i][j]) tot++;
}
for(int i=1;i<=n;i++){
for(int j=i%2?1:2;j<=m;j+=2){
if(c[i][j]) continue;
if(i-2>=1&&j-1>=1&&c[i-2][j-1]==0) adde((i-1)*m+j,(i-3)*m+j-1);
if(i-2>=1&&j+1<=m&&c[i-2][j+1]==0) adde((i-1)*m+j,(i-3)*m+j+1);
if(i-1>=1&&j-2>=1&&c[i-1][j-2]==0) adde((i-1)*m+j,(i-2)*m+j-2);
if(i-1>=1&&j+2<=m&&c[i-1][j+2]==0) adde((i-1)*m+j,(i-2)*m+j+2);
if(i+2<=n&&j-1>=1&&c[i+2][j-1]==0) adde((i-1)*m+j,(i+1)*m+j-1);
if(i+2<=n&&j+1<=m&&c[i+2][j+1]==0) adde((i-1)*m+j,(i+1)*m+j+1);
if(i+1<=n&&j-2>=1&&c[i+1][j-2]==0) adde((i-1)*m+j,i*m+j-2);
if(i+1<=n&&j+2<=m&&c[i+1][j+2]==0) adde((i-1)*m+j,i*m+j+2);
}
}
for(int i=1;i<=n;i++){
for(int j=i%2?1:2;j<=m;j+=2){
memset(vis,0,sizeof(vis));
if(find((i-1)*m+j)) cnt++;
}
}
printf("%d\n",tot-cnt);
return 0;
}

【bzoj4808】【马】二分图最大点独立集+简单感性证明的更多相关文章

  1. 【hdu1150】【Machine Schedule】二分图最小点覆盖+简单感性证明

    (上不了p站我要死了,侵权度娘背锅) 题目大意 有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式ai,如 ...

  2. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

  3. POJ1466 Girls and Boys(二分图最大点独立集)

    最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...

  4. BZOJ 1143: [CTSC2008]祭祀river(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题意: 思路: 二分图最大点独立集,首先用floyd判断一下可达情况. #include< ...

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

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

  6. POJ 2771 Guardian of Decency (二分图最大点独立集)

    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 25 ...

  7. BZOJ4808马——二分图最大独立集

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

  8. HDU--3829--Cat VS Dog【最大点独立集】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...

  9. 【POJ】1419:Graph Coloring【普通图最大点独立集】【最大团】

    Graph Coloring Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5775   Accepted: 2678   ...

随机推荐

  1. [转]JS获取URL传参方法

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  2. leetcode 211. 添加与搜索单词 - 数据结构设计 解题报告

    设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a- ...

  3. springboot13 Hikari 和Introspector

    SpringBoot Initializr Introspector(内省) class TestReflect { @Test fun testReflect() { //获取字节码对象 val c ...

  4. 【bzoj3325】[Scoi2013]密码 逆模拟Manacher

    题目描述 给出一个只包含小写字母的字符串的长度.以每一个字符为中心的最长回文串长度.以及以每两个相邻字符的间隙为中心的最长回文串长度,求满足条件的字典序最小的字符串. 输入 输入由三行组成.第一行仅含 ...

  5. 【bzoj4325】NOIP2015 斗地主(&“加强”版) 搜索

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  6. [bzoj1033] [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

  7. [Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) ](A~E)

    A: 题目大意:给你$a,b,c$三条边,可以给任意的边加任意的长度,求最少共加多少长度使得可以构成三角形 题解:排个序,若可以组成,输出$0$,否则输出$c-a-b+1(设a\leqslant b\ ...

  8. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  9. 电阻 (resistance)

    电阻 (resistance) 题目描述 每次小x物理作业没做完时,总是会去和老师交流感情,他们之间由此建立起来良好的师生关系.于是有一天,老师带着一道物理难题来见小x. 这道题给出了一个有n个电阻的 ...

  10. git bash 如何进入某个盘的特定文件夹

    下面是用gitbash进入E:\the fifth version of ecard\epayment这个文件夹下 命令如下图所示: