然后考虑正解

我们发现,最坏情况就是每个点都派驻军队,所以答案至多是“.”的数目

而且,每个点都至多只有一个入度和一个出度,所以我们可以将每个点拆成两个点,一个作为入点,一个作为出点,然后所有图上能到达的点由出点向入点建图

这样整个图就形成了一个二分图

然后在整个图上跑二分图匹配即可

答案即为“.”点数-二分图最大匹配数

稍微证明一下:我们的目的是最大化有入边的点的数量,那我们仅需让入点能更多的被匹配上即可

那也就是二分图匹配喽

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
}edge[];
int head[];
int maps[][];
char s[];
bool used[];
int f[];
int n,m,r,c;
int cnt=,cot;
queue <int> Q;
bool check(int x,int y)
{
if(x>&&x<=n&&y>&&y<=m&&maps[x][y])
{
return ;
}
return ;
}
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void add(int l,int r)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
head[l]=cnt++;
}
int po(int x,int y)
{
return (x-)*m+y;
}
int ppo(int x,int y)
{
return (x-)*m+y+n*m;
}
bool dfs(int x)
{
for(int i=head[x];i!=-;i=edge[i].next)
{
int to=edge[i].to;
if(used[to])
{
continue;
}
used[to]=;
if(!f[to]||dfs(f[to]))
{
f[to]=x;
return ;
}
}
return ;
}
int hungary()
{
int ret=;
while(!Q.empty())
{
memset(used,,sizeof(used));
int u=Q.front();
Q.pop();
if(dfs(u))
{
ret++;
}
}
return ret;
}
int main()
{
freopen("legion.in","r",stdin);
freopen("legion.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&r,&c);
init();
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=m;j++)
{
if(s[j]=='.')
{
maps[i][j]=;
Q.push(po(i,j));
cot++;
}else
{
maps[i][j]=;
}
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
int x0=i+r;
int y0=j+c;
if(check(x0,y0))
{
add(po(i,j),ppo(x0,y0));
}
x0=i+r;
y0=j-c;
if(check(x0,y0))
{
add(po(i,j),ppo(x0,y0));
}
x0=i+c;
y0=j+r;
if(check(x0,y0))
{
add(po(i,j),ppo(x0,y0));
}
x0=i+c;
y0=j-r;
if(check(x0,y0))
{
add(po(i,j),ppo(x0,y0));
}
}
}
printf("%d\n",cot-hungary());
return ;
}

bzoj 2150的更多相关文章

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

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

  2. bzoj 2150 最小路径覆盖

    最小路径覆盖问题是:给定一个DAG,该DAG的一个路径覆盖是一个路径的集合,使得每个点属于且仅属于其中一条路径,问题就是求一个大小最小的路径集合. 做法是将每个点A拆成两个点A1,A2,如果A-> ...

  3. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  4. BZOJ 2150 部落战争 (二分图匹配)

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

  5. 8月清北学堂培训 Day6

    今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通: 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u ...

  6. DP&图论 DAY 6 上午

    DP&图论  DAY 6  上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...

  7. BZOJ刷题指南(转)

    基础(65) 巨水无比(4):1214.3816:2B题:1000A+B:2462:输出10个1 模拟/枚举/暴力(15):4063傻子模拟:1968小学生暴力:1218前缀和暴力:3856读英文:4 ...

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

随机推荐

  1. Failed to read artifact descriptor for org.apache.maven.plugins:maven-install-plugin-JavaWeb(四)

    今天使用maven clean, maven install 出现了下图问题,只解决了 maven clean , 还有maven install 今天 使用maven clean 出现以下问题(把下 ...

  2. CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

    同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...

  3. SpringCloud概述

    ⒈官网说明 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现.配置中心.全链路监控.服务网关.负载均衡.熔断器等组件,除了基于Netflix的开源组件做高度 ...

  4. 如何能让MAC和PC都能读写移动硬盘

    Macbook Pro 移动硬盘 希捷硬盘就不用,有专业适用于苹果的软件. 1.在“LaunchPad”中找到并打开“磁盘工具”,在“磁盘工具”中可以看到移动硬盘的几个分区 2.选择一个分区后,选择“ ...

  5. MySQL用户授权【转】

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...

  6. Linux查看压缩文件内容【转】

    查看一个归档或者压缩文件的内容而无需解压它 得益于 Linux 社区,有很多命令行工具可以来达成上面的目标.下面就让我们来看看使用它们的一些示例. 1.使用 vim 编辑器 vim 不只是一个编辑器, ...

  7. js知识巩固

    1.数组操作中使用splice和slice进行删除数组的区别! splice会对原数组进行操作,返回的是被删除元素组成的数组,原数组会被进行改变即变成删除后的数组,用于删除列表中的元素,arr.spl ...

  8. 激活函数Sigmoid、Tanh、ReLu、softplus、softmax

    原文地址:https://www.cnblogs.com/nxf-rabbit75/p/9276412.html 激活函数: 就是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端. 常见 ...

  9. Android apk互调

    1.启动另外一个应用程序的主Activity. //这些代码是启动另外的一个应用程序的主Activity,当然也可以启动任意一个Activity ComponentName componetName ...

  10. Windows服务没有及时响应启动或控制请求1053

    参考链接: 解决“指定的服务已经标记为删除”问题 服务没有及时响应启动或控制请求 1053 关闭服务后,重新启动windows服务报错:"服务没有及时响应启动或控制请求 1053" ...