题目大意:给你一个n*m的棋盘,有一些坏点不能走,你有很多军队,每支军队可以像象棋里的马一样移动,不过马是1*2移动的,而军队是r*c移动的,军队只能从上往下移动,如果一个点已经被一直军队经过,那么其他军队不能再经过这个点,求覆盖所有非坏点的最少军队数

洛谷P2172传送门

对在某个点的军队可能跳的位置建边。把图抠出来,因为军队只能从上往下移动,所以他移动的方式就是是一条链,所以答案就是把这个图分成若干条链,求链的数量的最小值

这不就是二分图匹配么

对于一个链,除了端点,每个点都需要一个出边一个入边,跑匈牙利就行了

注意,每个点跑匈牙利之前都要清一次vis数组!才能正确表示某个点在这次匹配中是否已经被使用

 #include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 60
#define mod 20100403
#define p(i,j) ((i-1)*m+j)
#define dd double
using namespace std; char str[N][N];
int n,m,r,c,cte;
int mp[N][N],head[N*N],vis[N*N],mch[N*N];
int xx[],yy[];
struct Edge{int to,nxt;}edge[N*N*];
void ae(int u,int v){
++cte,edge[cte].to=v;
edge[cte].nxt=head[u];
head[u]=cte;
}
int check(int x,int y){
if(x<||y<||x>n||y>m||mp[x][y]) return ;
return ;
}
void build_edge()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(mp[i][j]) continue;
for(int k=;k<;k++)
if(check(i+xx[k],j+yy[k]))
ae(p(i,j),p(i+xx[k],j+yy[k]));
}
}
int Hungary(int x)
{
for(int j=head[x];j!=-;j=edge[j].nxt){
int v=edge[j].to;
if(!vis[v])
{
vis[v]=;
if(!mch[v]||Hungary(mch[v])){
mch[v]=x;
return ;
}
}
}return ;
} int main()
{
scanf("%d%d%d%d",&n,&m,&r,&c);
for(int i=;i<=n;i++){
scanf("%s",str[i]+);
for(int j=;j<=m;j++)
if(str[i][j]=='.') mp[i][j]=;
else mp[i][j]=;
}
xx[]=r,xx[]=r,xx[]=c,xx[]=c;
yy[]=c,yy[]=-c,yy[]=r,yy[]=-r;
int ans=;
memset(head,-,sizeof(head));
build_edge();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(mp[i][j]) continue;
memset(vis,,sizeof(vis));
if(!Hungary(p(i,j))) ans++;}
printf("%d\n",ans);
return ;
}

BZOJ 2150 部落战争 (二分图匹配)的更多相关文章

  1. BZOJ 2150: 部落战争 最大流

    2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  2. BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)

    题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...

  3. BZOJ 1059 矩阵游戏 二分图匹配

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...

  4. BZOJ [ZJOI2007]矩阵游戏(二分图匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6390  Solved: 3133[Submit][Stat ...

  5. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  6. BZOJ 1562 变换序列(二分图匹配)

    显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...

  7. BZOJ 1562 变换序列 二分图匹配+字典序

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...

  8. BZOJ 1191 超级英雄Hero 二分图匹配

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1191 题目大意: 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主 ...

  9. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...

随机推荐

  1. [洛谷 P1967] 货车运输 (最大生成树 lca)

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  2. 树状数组||归并排序求逆序对+离散化 nlogn

    我好咸鱼. 归并排序之前写过,树状数组就是维护从后往前插入,找比现在插入的数大的数的数量. 如果值域大,可以离散化 #include <cstdio> #include <cstri ...

  3. preload、prefetch的认识

    预加载 现在的网络情况虽然很乐观,但是 defer和async 当浏览器碰到 script 脚本的时候: <script src="script.js"></sc ...

  4. keepalived安装实现nginx主备高可用

    . keepalived安装环境 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y install popt ...

  5. ASP.NET中的Webconfig 和 Global.asax区别

    Web.Config与Global.asax的区别: Config可以根据不同的错误类型定义不同的错误页,网站重定义转向新的错误页面. Global,在全局错误中写入应用程序事件错误信息,并在当前页输 ...

  6. 漫说好管理vs.坏管理

    天地会珠海分舵注:本文英文版来自Medium今日热点头条.漫画简单明了,全文差点儿没有多余的语言去装饰.两天内获得两千三百多个推荐,且读者的反馈也相当的热烈.中文版由天地会珠海分舵编译后分享给大家. ...

  7. gitlab一键安装 笔记

    0 简单介绍bitnami和gitlab bitnami BitNami是一个开源项目,该项目产生的开源软件包安装 Web应用程序和解决方式堆栈.以及虚拟设备. bitnami主办Bitrock公司成 ...

  8. 数据库SQL Server2012笔记(三)——表的复杂查询

    1.数据分组--max/min/avg/sum/count select  avg(字段名),sum(字段名)  from  表名 select  count(*)  from  表名 select ...

  9. 婚礼上的谎言(C++实现)

    #include<iostream> using namespace std; void main(void) { int a,b,c; char DD,EE,FF; for (a=1;a ...

  10. asp.net website 单独编译某个页面,连带编译app_code

    选中某一个页面,然后右键build page