【题目大意】

给出一张图,'*'表示不能走的障碍。已知每只军队可以按照r*c的方向行军,且军队与军队之间路径不能交叉。问占据全部'.'最少要多少支军队?

【思路】

首先注意题意中有说“军队只能往下走”,弄清楚方向。

从某点往它能走的四个点走一趟,连边。最小路径覆盖=总数-二分图最大匹配。

哦耶!老了,连匈牙利的板子都敲错orzzzzzz

 #include<bits/stdc++.h>
using namespace std;
const int MAXN=;
int m,n,r,c,maps[MAXN][MAXN];
int lk[MAXN*MAXN],vis[MAXN*MAXN];
vector<int> E[MAXN*MAXN]; int check(int x,int y)
{
if (x>= && x<=m && y>= && y<=n && maps[x][y]) return ;else return ;
} int id(int x,int y){return ((x-)*n+y);} void addedge(int u,int v)
{
E[u].push_back(v);
} int find(int u)
{
for (int i=E[u].size()-;i>=;i--)
{
int v=E[u][i];
if (!vis[v])
{
vis[v]=;
if (!lk[v]|| find(lk[v]))//呜哇这里写成了find(v)半天没有发现,果然是老阿姨了啊
{
lk[v]=u;
return ;
}
}
}
return ;
} void init()
{
scanf("%d%d%d%d",&m,&n,&r,&c);
for (int i=;i<=m;i++)
{
char str[MAXN];
scanf("%s",str);
for (int j=;j<n;j++)
if (str[j]=='.') maps[i][j+]=;else maps[i][j+]=;
}
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)
if (maps[i][j])
{
if (check(i+r,j+c)) addedge(id(i,j),id(i+r,j+c));
if (check(i+r,j-c)) addedge(id(i,j),id(i+r,j-c));
if (check(i+c,j+r)) addedge(id(i,j),id(i+c,j+r));
if (check(i+c,j-r)) addedge(id(i,j),id(i+c,j-r));
}
} void solve()
{
memset(lk,,sizeof(lk));
int sum=,ans=;
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)
{
if (maps[i][j]==)
{
int x=id(i,j);
memset(vis,,sizeof(vis));
sum++;
if (find(x)) ans++;
}
}
printf("%d",sum-ans);
} int main()
{
init();
solve();
}

【最小路径覆盖】BZOJ2150-部落战争的更多相关文章

  1. [bzoj2150]部落战争_二分图最小路径覆盖

    部落战争 bzoj-2150 题目大意:题目链接. 注释:略. 想法: 显然是最小路径覆盖,我们知道:二分图最小路径覆盖等于节点总数-最大匹配. 所以我们用匈牙利或者dinic跑出最大匹配,然后用总结 ...

  2. BZOJ-2150部落战争(最小路径覆盖)

    2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国 ...

  3. BZOJ2150部落战争——最小路径覆盖

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

  4. 【最小路径覆盖】【二分图】【最大流】【Dinic】bzoj2150 部落战争

    裸的最小路径覆盖. 把每个点拆点,变成二分图. 对于可以连边的点对(i,j):i->j'(1); 对于任意一点i,若i点为'.':S->i(1),i'->T(1); 答案为所有'.' ...

  5. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

  6. P2172 [国家集训队]部落战争(最小路径覆盖)

    P2172 [国家集训队]部落战争 每个点仅走一次:最小路径覆盖 套路地拆点,具体看代码中的$draw()$ 流量每增加1,意味着一支军队可以多走一格,代价减少1 最后答案即为总点数$-dinic() ...

  7. 国家集训队 部落战争 网络流最小路径覆盖 洛谷P2172

    洛谷AC传送门! step1: 题目大意 有一张M x N的网格图,有一些点为“ * ”可以走,有一些点为“ x ”不能走,每走一步你都可以移动R * C 个格子(参考象棋中马的走法),且不能回头,已 ...

  8. bzoj2150: 部落战争(匈牙利)

    2150: 部落战争 题目:传送门 题解: 辣鸡数据..毁我AC率 先说做法,很容易就可以看出是二分图匹配的最小路径覆盖(可能是之前不久刚做过类似的题) 一开始还傻逼逼的去直接连边然后准备跑floyd ...

  9. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

随机推荐

  1. 通用标签、属性(body属性、路径、格式控制)

    通用标签.属性 一.body属性 1.bgcolor属性:网页背景颜色 2.text属性:规定文档中所有文本的颜色. 3.background属性:规定文档的背景图像. 二.路径 1.绝对路径: 从根 ...

  2. Test plan

    Options for Test Strategy: 1. Regular test: all the planned test cases will be executed 2. Extented ...

  3. 使用JSON语法创建JS对象(重要)

    JS对象的键值可以加单引号或者不加或者加双引号 JSON语法提供了一种更简单的方式来创建对象,可以避免书写函数,也可避免用new关键字,可以直接创建一个JS对象,使用一个花括号,然后将每个属性写成&q ...

  4. Mysql储存过程7: case

    #用在储存过程中: create procedure k() begin declare number int; )); case number then select '>0'; else s ...

  5. http://www.onvif.org/onvif/ver20/util/operationIndex.html

    http://www.onvif.org/onvif/ver20/util/operationIndex.html

  6. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

  7. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  8. BootStarp的form表单的基本写法

    代码如下: <!DOCTYPE html> <html> <head> <title>BootStrap的基础入门</title> < ...

  9. Otto:EventBus

    Otto:EventBus 2014年6月20日 星期五 15:14 参考: http://www.mythroad.net/?p=4151 Otto 是Android系统的一个Event Bus模式 ...

  10. fastdfs5.x Java客户端简单例子

    下载源码, 使用maven编译并安装 https://github.com/happyfish100/fastdfs-client-java.git 新建maven工程,引入fastdfs-clien ...