题目描述

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

输入

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

输出

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

样例输入

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

样例输出

【样例输出一】
4

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

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

提示

来源

  //BZOJ没有,我来加个:国家集训队2011

吐槽

  n和m都小于50,空间至少要开到50*50=2500!

解题思路

  一道最小路径覆盖的题目,可以按照题意建图,对于点$(i,j)$,向$(i+r,j+c)$、$(i+r,j-c)$、$(i+c,j+r)$、$(i+c,j-r)$连单向边(前提是点在地图上且是城市),然后跑最小路径覆盖即可,我依然跑匈牙利,这提数据范围用不到dinic,但是dinic跑得快。

源代码

#include<cstdio>
#include<vector>
#include<cstring>
int m,n,r,c,ans=,N=;
char ch;
bool g[][]={};//(x-1)*n+y
bool vis[]={};
struct men{
int lover;
std::vector<int> t;
}man[]; int woman[]={}; bool dfs(int u)
{
int sz=man[u].t.size();
for(int i=;i<sz;i++)
{
int w=man[u].t[i];
if(!vis[w])
{
vis[w]=;
if(!woman[w]||dfs(woman[w]))
{
woman[w]=u;
man[u].lover=w;
return ;
}
}
}
return ;
}
int main()
{
//freopen("lanzerb.in","r",stdin);
//freopen("lanzerb.out","w",stdout);
scanf("%d %d %d %d",&m,&n,&r,&c);
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
{
scanf("\n%c",&ch);
if(ch=='.')
g[i][j]=,N++;
}
}
int bh[][]={{r,c},{c,-r},{c,r},{r,-c}};
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
{
if(!g[i][j]) continue;
int id=(i-)*n+j;
for(int k=;k<;k++)
{
if(r==c&&k>) break;
int x=i+bh[k][],y=j+bh[k][];
if(x>=&&x<=m&&y>=&&y<=n&&g[x][y])
{
man[id].t.push_back((x-)*n+y);
}
}
}
}
memset(woman,,sizeof(woman));
for(int i=;i<=n*m;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",N-ans);
return ;
}

BZOJ 2150 cogs 1861 [国家集训队2011]部落战争的更多相关文章

  1. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  2. 【BZOJ 2120】【国家集训队 2011】【数颜色】(莫队)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  3. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

  4. happiness[国家集训队2011(吴确)]

    [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...

  5. COGS1882 [国家集训队2011]单选错位

    ★   输入文件:nt2011_exp.in   输出文件:nt2011_exp.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...

  6. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

  7. COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)

    题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...

  8. 【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割

    这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每 ...

  9. Bzoj 2134: [国家集训队2011]单选错位(期望)

    2134: 单选错位 Time Limit: 10 Sec Memory Limit: 259 MB Description Input n很大,为了避免读入耗时太多,输入文件只有5个整数参数n, A ...

随机推荐

  1. SQL Server 2005数据库定期备份(非常详细)与 SQL Server 2005数据库备份定期清理

     SQL Server 2005数据库定期备份 分类: SQL Server 20052011-01-06 16:25 3320人阅读 评论(1) 收藏 举报 sql server数据库sqlserv ...

  2. hdoj--5104--Primes Problem(素数打表)

    Primes Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. Python中的math和保留小数位数方法

    转载自 http://xukaizijian.blog.163.com/blog/static/17043311920111163272414/ math模块实现了许多对浮点数的数学运算函数.  这些 ...

  4. hdu3511-Prison Break

    纪念一下人生中第一道扫描线算法的题.....其实不是严格上的第一道...第一次遇到的那个至今没过..... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pi ...

  5. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  6. 易企CMS仿站标签说明

    头部标签: 每个页面都必须加的三大标签(将标签放入header.tpl里面,这样只需在每个模板中调用header.tpl即可): <title>{$seotitle}_{$sitename ...

  7. 设计模式之桥接模式(Java语言描述)

    桥接模式定义 將抽象部分与它的具体实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体模式或接口模式. Decouple an abstraction from its imple ...

  8. poj 1564 Sum It Up 搜索

    题意: 给出一个数T,再给出n个数.若n个数中有几个数(可以是一个)的和是T,就输出相加的式子.不过不能输出相同的式子. 分析: 运用的是回溯法.比较特殊的一点就是不能输出相同的式子.这个可以通过ma ...

  9. 【Oracle】rollup函数

    当我们在做报表统计的时候,很多时候需要用到‘合计’这个功能,比如我们想得到如下格式的报表: 这张表是按照deptno分组,然后按照deptno分组合计.rollup函数可以完美的解决这个问题. 1.建 ...

  10. Table is specified twice, both as a target for 'UPDATE' and as a separate source

    UPDATE Bins b SET b.ShopSn =’111201611111168706’ WHERE b.Id IN (SELECT b.Id FROM Bins b JOIN BinInve ...