2150: 部落战争

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 879  Solved: 493
[Submit][Status][Discuss]

Description

lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土。 A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住。lanzerb把自己的部落分成若干支军队,他们约定: 1. 每支军队可以从任意一个城镇出发,并只能从上往向下征战,不能回头。途中只能经过城镇,不能经过高山深涧。 2. 如果某个城镇被某支军队到过,则其他军队不能再去那个城镇了。 3. 每支军队都可以在任意一个城镇停止征战。 4. 所有军队都很奇怪,他们走的方法有点像国际象棋中的马。不过马每次只能走1*2的路线,而他们只能走R*C的路线。 lanzerb的野心使得他的目标是统一全国,但是兵力的限制使得他们在配备人手时力不从心。假设他们每支军队都能顺利占领这支军队经过的所有城镇,请你帮lanzerb算算至少要多少支军队才能完成统一全国的大业。

Input

第一行包含4个整数M、N、R、C,意义见问题描述。接下来M行每行一个长度为N的字符串。如果某个字符是'.',表示这个地方是城镇;如果这个字符时'x',表示这个地方是高山深涧。

Output

输出一个整数,表示最少的军队个数。

Sample Input

【样例输入一】
3 3 1 2
...
.x.
...
【样例输入二】
5 4 1 1
....
..x.
...x
....
x...

Sample Output

【样例输出一】
4

【样例输出二】
5
【样例说明】

【数据范围】
100%的数据中,1<=M,N<=50,1<=R,C<=10。

HINT

Source

[Submit][Status][Discuss]

题解:最小路径覆盖

有一个关于二分图的结论:最小路径覆盖=二分图总点数-最大匹配数

我们在建图的时候将每个点都拆成两个点——入点和出点,如果可以从x走到y,就从x的出点向y的入点连边,然后跑二分图的最大匹配即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define N 50003
using namespace std;
int n,m,point[N],next[N],v[N],belong[N],cur[N],r,c;
int map[53][53],tot;
void add(int x,int y)
{tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y;//tot++; next[tot]=point[y]; point[y]=tot; v[tot]=x;
}
bool find(int x,int k)
{for (int i=point[x];i;i=next[i]){if (cur[v[i]]==k) continue;cur[v[i]]=k;if (!belong[v[i]]||find(belong[v[i]],k)) {belong[v[i]]=x;return true;}}return false;
}
int main()
{freopen("a.in","r",stdin);scanf("%d%d%d%d",&n,&m,&r,&c);int base=n*m; int size=0;for (int i=1;i<=n;i++){char s[53]; scanf("%s",s+1);for (int j=1;j<=m;j++)if (s[j]!='x') map[i][j]=1;else size++;}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (map[i][j]) {int x=i+r; int y=j+c;if (x>0&&y>0&&x<=n&&y<=m&&map[x][y]) add((i-1)*m+j,(x-1)*m+y+base);x=i+r; y=j-c;if (x>0&&y>0&&x<=n&&y<=m&&map[x][y]) add((i-1)*m+j,(x-1)*m+y+base);x=i+c; y=j+r;if (x>0&&y>0&&x<=n&&y<=m&&map[x][y]) add((i-1)*m+j,(x-1)*m+y+base);x=i+c; y=j-r;if (x>0&&y>0&&x<=n&&y<=m&&map[x][y]) add((i-1)*m+j,(x-1)*m+y+base);}int ans=0;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){int t=(i-1)*m+j;if (find(t,t)) ans++;}printf("%d\n",n*m-size-ans);
}

bzoj 2150: 部落战争 (最小路径覆盖)相关推荐

  1. bzoj2150部落战争 最小路径覆盖

    http://www.lydsy.com/JudgeOnline/problem.php?id=2150 之前一直不会的二分图. 然后百度百科普及了一下有关最小路径覆盖的知识. 详情请见:http:/ ...

  2. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

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

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

  4. 51nod_2929 部落战争(DAG最小路径覆盖)

    部落战争 Problem Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些 ...

  5. (拆点+最小路径覆盖) bzoj 2150

    2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 518  Solved: 298 [Submit][Status][Discus ...

  6. 【网络流24题】最小路径覆盖问题

    [题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...

  7. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

    在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...

  8. 有向图最小路径覆盖方法浅析、证明 //hdu 3861

    路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...

  9. HDU4160(最小路径覆盖问题)

    题意:当满足条件wi<wj,hi<hl和li<lj时,求解通过优化嵌套给定的娃娃可以获得的最外层洋娃娃的最小数量. 思路:如果嵌套的娃娃越多,则剩下的娃娃就越少,意味着单独出来的娃娃 ...

最新文章

  1. 推荐几款好用又免费的项目管理工具
  2. DAY11-MYSQL之ORM框架SQLAlchemy
  3. 神策 FM | 数据驱动时代,你的岗位如何转变?
  4. 记录几款比较好用的jquery插件
  5. 程序人生:提高编程逻辑的 10 种最“疯狂”的方法
  6. 飞畅科技告诉你什么是集成串口服务器POE交换机?
  7. iOS UI-常用控件
  8. 在java代码中设置TextView文本内容可滚动
  9. 智能手机收邮件之Mobile
  10. 【须弥SUMERU】宜信分布式安全服务编排实践
  11. Spring_day1
  12. 不要再问类似如C++和C#谁好谁坏,谁更有前景的问题
  13. 6675温度波动大_现场温度仪表安装调试常见的故障分析与处理方法
  14. 风变编程python离线版_如何看待风变编程的Python网课
  15. 一个英文字母,一个中文各占多少字节
  16. 如何打开损坏的PDF文件查看内容并修复
  17. ToDoListEditor 任务清单工具
  18. 使用环信sdk做一个简单的聊天APP
  19. 计算机需要那些高中数学知识点,高中数学-知识点总结-最全版.doc
  20. 网站管理助手4.0 mysql_网站管理助手v4.0 建站流程

热门文章

  1. HNU工训中心STC-B学习板大作业-基于OLED模块的多功能MP4
  2. 修改战网服务器,《使命召唤17》战网地区怎么改 战网地区修改方法分享
  3. word中打字会覆盖下一个字
  4. 20160124.CCPP详解体系(0003天)
  5. MDB Jet.OLEDB.4.0(32位)和 ACE.OLEDB.12.0 ACCDB(64位)的区别
  6. 牧牛区块链,区块链发展呈现的新机遇
  7. 关于苹果销量的一些看法
  8. 高级工程师做事方法总结篇
  9. 【转载】中国哲学基础及中国文化
  10. 支付宝集五福神器来了!100多张额外福卡,集不齐你打我