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. kali优化配置(3)--工具箱

    1.netcat 收集信息.Telnet/banner.传输文本信息.连接服务器端口. *通过IP,连接服务器端口: *信息通信: *重定向符号:> (e.g:>>ps.txt:重定 ...

  2. tenorflow 模型调优

    # Create the Timeline object, and write it to a json from tensorflow.python.client import timeline t ...

  3. Intel MKL函数之 cblas_sgemm、cblas_sgemm_batch

    cblas_sgemm int m = 40; int k = 20; int n = 40; std::vector<float> a(m*k, 1.0); std::vector< ...

  4. PHP实现session共享

    通过修改PHP-FPM配置文件,实现session会话共享: - 配置PHP使用memcached服务器共享Session信息 - 客户端访问两台不同的后端Web服务器时,Session 信息一致 环 ...

  5. 2018ICPC银川 L Continuous Intervals 单调栈 线段树

    题意:给你一个序列,问你这个序列有多少个子区间,满足把区间里的数排序之后相邻两个数之间的差 <= 1 ? 思路:https://blog.csdn.net/u013534123/article/ ...

  6. 六、MyBatis-缓存机制

    MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率.MyBatis系统中默认定义了两级缓存, 一级 缓存和 二级缓存.– 1.默认情况下,只有一级缓 ...

  7. grunt教程

    https://blog.csdn.net/sinat_38992528/article/details/79400595

  8. [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]

    [luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...

  9. 树上倍增 x

    树上倍增. dfs序的做法: 思路: //f[i][j]表示dfs序中序号为i到序号为j的点之间深度最小的点的编号 dfs序[]//存0-...(id)编号 节点[]//存dfs序中所经过的节点号 d ...

  10. ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中

    ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中 ResquestInfoServlet.j ...