【题目大意】

给出一张图,'*'表示不能走的障碍。已知每只军队可以按照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. 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)

    题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...

  2. Linux下使用tree命令查看目录结构

    Linux下的文件虽然是层次型组织结构的,但是我们平时登录到主机上的时候都是使用的各种shell并没有图形界面,看上去很不直观,Linux下有个小命令叫做tree,可以以目录树的形式显示文件结构,类似 ...

  3. JFinal向客户端渲染图片的方法

    JFinal提供了好几种方便的render但是不知道为啥就是没有提供直接渲染图片的render,如果我们直接在Controller的方法中往输入流中写的话是还是会有默认的render生效的,比如下面这 ...

  4. JS日历控件特效代码layDate

    https://www.js-css.cn/a/jscode/date/2015/0405/1461.html

  5. Git HTTPS 方式自动保存用户名密码

    一行命令搞定: git config --global credential.helper wincred 第一次输入用户名和密码提交,第二次就不需要了 参考: https://help.github ...

  6. python中赋值、浅拷贝、深拷贝详解(转)

    一.赋值 >>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')139701469 ...

  7. pythonif语句和循环语句

    1.if语句用法 # if语句用法(缩进相同的成为一个代码块) score=90 if score>=60: print("合格") print("OK" ...

  8. 一个Servlet处理增删改查的方法

    处理的思路是在servlet中定义不同的增删改查方法,页面请求 的时候携带请求的参数,根据参数判断调用不同的方法. package cn.xm.small.Servlet; import java.i ...

  9. Thinkphp的SQL查询方式

    一.普通查询方式 a.字符串$arr=$m->where("sex=0 and username='gege'")->find();b.数组$data['sex']=0 ...

  10. 自动化测试===adb 解锁手机的思路

    在adb里有模拟按键/输入的命令 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列 ...