P2172 [国家集训队]部落战争

每个点仅走一次:最小路径覆盖

套路地拆点,具体看代码中的$draw()$

流量每增加1,意味着一支军队可以多走一格,代价减少1

最后答案即为总点数$-dinic()$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int read(){
char c=getchar();int x=,f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return f?x:-x;
}
#define M 400000
int n,m,R,C,S,T,d[M],cur[M],tt;
char q[][]; bool vis[M];
int Cnt=,hd[M],nxt[M],ed[M],poi[M],val[M];
void adde(int x,int y,int v){
nxt[ed[x]]=++Cnt; hd[x]=hd[x]?hd[x]:Cnt;
ed[x]=Cnt; poi[Cnt]=y; val[Cnt]=v;
}
void link(int x,int y,int v){adde(x,y,v),adde(y,x,);}
#define to poi[i]
bool Bfs(){
memset(vis,,sizeof(vis));
queue <int> h; h.push(S);
vis[S]=; d[S]=;
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=hd[x];i;i=nxt[i])
if(!vis[to]&&val[i]>)
vis[to]=,d[to]=d[x]+,h.push(to);
}return vis[T];
}
int Dfs(int x,int a){
if(!a||x==T) return a;
int F=,f;
for(int &i=cur[x];i;i=nxt[i])
if(d[to]==d[x]+&&(f=Dfs(to,min(a,val[i])))>){
F+=f,a-=f,val[i]-=f,val[i^]+=f;
if(!a) break;
}
return F;
}
int Dinic(){
int re=;
while(Bfs()){
for(int i=;i<=T;++i) cur[i]=hd[i];
re+=Dfs(S,1e9);
}return re;
}
bool is(int x,int y){return x>&&x<=n&&y>&&y<=m&&q[x][y]=='.';}
int id(int x,int y){return x*m-m+y;}
void draw(int x,int y){
int p=id(x,y); ++tt; link(S,p,); link(p+n*m,T,);
if(is(x+R,y+C)) link(p,id(x+R,y+C)+n*m,);
if(is(x+R,y-C)) link(p,id(x+R,y-C)+n*m,);
if(is(x+C,y+R)) link(p,id(x+C,y+R)+n*m,);
if(is(x+C,y-R)) link(p,id(x+C,y-R)+n*m,);
}
int main(){
scanf("%d%d%d%d",&n,&m,&R,&C); S=n*m*+; T=S+;
for(int i=;i<=n;++i) scanf("%s",q[i]+);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(q[i][j]=='.') draw(i,j);
printf("%d\n",tt-Dinic());
return ;
}

P2172 [国家集训队]部落战争(最小路径覆盖)的更多相关文章

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

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

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

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

  3. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...

  4. 洛谷P2172 [国家集训队]部落战争 题解

    题目链接:https://www.luogu.org/problemnew/show/P2172 分析: 不要被[国家集训队]的标签吓到,其实这题不是很难. 本题可以对比P4304 [TJOI2013 ...

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

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

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

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

  7. [国家集训队]部落战争 最大流 BZOJ2150

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

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

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

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

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

随机推荐

  1. spl_autoload_register() 函数实现的自动加载

    和Python用module来区分代码块不同,PHP按照命名空间来区分,开始学PHP的时候一心认定了如果想用 use 关键字来导入(Python的习惯说法)一个类或者函数或者其他对象的话,必须先inc ...

  2. eclipse没有Web项目和Server选项

    (1)在Eclipse中菜单help选项中选择install new software选项 (2)在work with 栏中输入 http://download.eclipse.org/release ...

  3. mybaties数据源配置类型(POOLED、JNDI、UNPOOLED)

    dataSource的类型可以配置成其内置类型之一,如UNPOOLED.POOLED.JNDI. 如果将类型设置成UNPOOLED,mybaties会为每一个数据库操作创建一个新的连接,并关闭它.该方 ...

  4. 怎么在tensorflow中打印graph中的tensor信息

    from tensorflow.python import pywrap_tensorflow import os checkpoint_path=os.path.join('./model.ckpt ...

  5. Jmeter参数化控件意见收集

    1.可以读取EXCEL,可以自定义SHEET,行和列: 2.数据可以加密传输,加密方式如下: 1)SHA1 2)SHA224 3)SHA256 4)SHA384 5)SHA512 6)MD5 7)Hm ...

  6. Yii 1.1 常规框架部署和配置

    <?php //index.php //入口文件配置操作 // change the following paths if necessary $yii=dirname(__FILE__).'/ ...

  7. (转)linux 命令访问url: curl http://www.baidu.com/index.html

    转:https://blog.csdn.net/michael1112/article/details/79119424 1.elinks - lynx-like替代角色模式WWW的浏览器 例如: e ...

  8. (转)k8s集群部署二:flannel网络

    转:https://blog.csdn.net/sinat_35930259/article/details/79946146 Overlay Network模式 覆盖网络,在基础网络上叠加的一种虚拟 ...

  9. Validform验证插件

    http://validform.club/index.html

  10. Kubernetes 对象管理的三种方式

    Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...