BZOJ 2150 部落战争 (二分图匹配)
题目大意:给你一个n*m的棋盘,有一些坏点不能走,你有很多军队,每支军队可以像象棋里的马一样移动,不过马是1*2移动的,而军队是r*c移动的,军队只能从上往下移动,如果一个点已经被一直军队经过,那么其他军队不能再经过这个点,求覆盖所有非坏点的最少军队数
对在某个点的军队可能跳的位置建边。把图抠出来,因为军队只能从上往下移动,所以他移动的方式就是是一条链,所以答案就是把这个图分成若干条链,求链的数量的最小值
这不就是二分图匹配么
对于一个链,除了端点,每个点都需要一个出边一个入边,跑匈牙利就行了
注意,每个点跑匈牙利之前都要清一次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 部落战争 (二分图匹配)的更多相关文章
- BZOJ 2150: 部落战争 最大流
2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)
题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...
- BZOJ 1059 矩阵游戏 二分图匹配
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...
- BZOJ [ZJOI2007]矩阵游戏(二分图匹配)
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6390 Solved: 3133[Submit][Stat ...
- [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...
- BZOJ 1562 变换序列(二分图匹配)
显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...
- BZOJ 1562 变换序列 二分图匹配+字典序
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...
- BZOJ 1191 超级英雄Hero 二分图匹配
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1191 题目大意: 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主 ...
- P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖
二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...
随机推荐
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 树状数组||归并排序求逆序对+离散化 nlogn
我好咸鱼. 归并排序之前写过,树状数组就是维护从后往前插入,找比现在插入的数大的数的数量. 如果值域大,可以离散化 #include <cstdio> #include <cstri ...
- preload、prefetch的认识
预加载 现在的网络情况虽然很乐观,但是 defer和async 当浏览器碰到 script 脚本的时候: <script src="script.js"></sc ...
- keepalived安装实现nginx主备高可用
. keepalived安装环境 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y install popt ...
- ASP.NET中的Webconfig 和 Global.asax区别
Web.Config与Global.asax的区别: Config可以根据不同的错误类型定义不同的错误页,网站重定义转向新的错误页面. Global,在全局错误中写入应用程序事件错误信息,并在当前页输 ...
- 漫说好管理vs.坏管理
天地会珠海分舵注:本文英文版来自Medium今日热点头条.漫画简单明了,全文差点儿没有多余的语言去装饰.两天内获得两千三百多个推荐,且读者的反馈也相当的热烈.中文版由天地会珠海分舵编译后分享给大家. ...
- gitlab一键安装 笔记
0 简单介绍bitnami和gitlab bitnami BitNami是一个开源项目,该项目产生的开源软件包安装 Web应用程序和解决方式堆栈.以及虚拟设备. bitnami主办Bitrock公司成 ...
- 数据库SQL Server2012笔记(三)——表的复杂查询
1.数据分组--max/min/avg/sum/count select avg(字段名),sum(字段名) from 表名 select count(*) from 表名 select ...
- 婚礼上的谎言(C++实现)
#include<iostream> using namespace std; void main(void) { int a,b,c; char DD,EE,FF; for (a=1;a ...
- asp.net website 单独编译某个页面,连带编译app_code
选中某一个页面,然后右键build page