先不考虑只有一个显得有些特殊的天兵。

  可以发现超能力的作用实质上是使兵更换职业。每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地方,不会造成其中一个次数增加。

  于是预处理出每个兵到达每个位置的最少代价。之后二分答案,把每个兵向可以到达的目标位置连边。跑最大流就可以知道是否可行。

  最后考虑天兵。天兵可以任意游走,并且与天兵换职业的兵可以直接到达目的地。那么在最大流的结果上加上二分出的答案即可,因为每次使用超能力都可以送走一个兵。

  1A爽爆。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 110
int n,m,k,l,dis[N][N][N],a[N][N],w[N][N],ans;
struct pos{int x,y;}u[N],v[N];
namespace shortestpath
{
int d[N*N<<],p[N*N<<],t=;
int wx[]={,,-,},wy[]={,,,-};
bool flag[N*N<<];
struct data{int to,nxt,len;}edge[N*N<<];
int trans(int x,int y,int op){return op*n*m+(x-)*m+y;}
void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
struct data2
{
int x,d;
bool operator <(const data2&a) const
{
return d>a.d;
}
};
priority_queue<data2> q;
void make()
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
for (int k=;k<;k++)
if (i+wx[k]>&&i+wx[k]<=n&&j+wy[k]>&&j+wy[k]<=m)
if (a[i][j]<a[i+wx[k]][j+wy[k]])
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),),
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),);
else if (a[i][j]>a[i+wx[k]][j+wy[k]])
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),),
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),);
else
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),),
addedge(trans(i,j,),trans(i+wx[k],j+wy[k],),);
}
}
void dijkstra(int start)
{
memset(d,,sizeof(d));d[trans(u[start].x,u[start].y,start>k)]=;
memset(flag,,sizeof(flag));
while (!q.empty()) q.pop();
q.push((data2){trans(u[start].x,u[start].y,start>k),});
for (int i=;i<=(n*m<<);i++)
{
while (!q.empty()&&flag[q.top().x]) q.pop();
if (q.empty()) break;
data2 v=q.top();q.pop();
flag[v.x]=;
for (int j=p[v.x];j;j=edge[j].nxt)
if (v.d+edge[j].len<d[edge[j].to])
{
d[edge[j].to]=v.d+edge[j].len;
q.push((data2){edge[j].to,d[edge[j].to]});
}
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
dis[start][i][j]=min(d[trans(i,j,)],d[trans(i,j,)]);
}
}
namespace maxflow
{
const int S=,T=;
int ans,p[N<<],d[N<<],q[N<<],cur[N<<],t;
struct data{int to,nxt,cap,flow;}edge[N*N<<];
void addedge(int x,int y,int z)
{
t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,p[x]=t;
t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,edge[t].flow=,p[y]=t;
}
bool bfs()
{
memset(d,,sizeof(d));d[S]=;
int head=,tail=;q[]=S;
do
{
int x=q[++head];
for (int i=p[x];~i;i=edge[i].nxt)
if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
{
d[edge[i].to]=d[x]+;
q[++tail]=edge[i].to;
}
}while (head<tail);
return ~d[T];
}
int work(int k,int f)
{
if (k==T) return f;
int used=;
for (int i=cur[k];~i;i=edge[i].nxt)
if (d[k]+==d[edge[i].to])
{
int w=work(edge[i].to,min(edge[i].cap-edge[i].flow,f-used));
edge[i].flow+=w,edge[i^].flow-=w;
if (edge[i].flow<edge[i].cap) cur[k]=i;
used+=w;if (used==f) return f;
}
if (used==) d[k]=-;
return used;
}
void make(int lim)
{
t=-;memset(p,,sizeof(p));
for (int i=;i<=(k<<);i++) addedge(S,i,);
for (int i=;i<=l;i++) addedge((k<<)+i,T,w[v[i].x][v[i].y]);
for (int i=;i<=(k<<);i++)
for (int j=;j<=l;j++)
if (dis[i][v[j].x][v[j].y]<=lim) addedge(i,(k<<)+j,);
}
int dinic(int lim)
{
make(lim);
ans=;
while (bfs())
{
memcpy(cur,p,sizeof(p));
ans+=work(S,N);
}
return ans;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2547.in","r",stdin);
freopen("bzoj2547.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),k=read(),l=read();
for (int i=;i<=(k<<|);i++) u[i].x=read(),u[i].y=read();
for (int i=;i<=l;i++) v[i].x=read(),v[i].y=read(),w[v[i].x][v[i].y]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[i][j]=read();
shortestpath::make();
for (int i=;i<=(k<<);i++) shortestpath::dijkstra(i);
int l=,r=k<<,ans;
while (l<=r)
{
int mid=l+r>>;
if (maxflow::dinic(mid)+mid>=(k<<)) ans=mid,r=mid-;
else l=mid+;
}
cout<<ans;
return ;
}

BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)的更多相关文章

  1. bzoj2547: [Ctsc2002]玩具兵

    划了一天水,其实我还是有点愧疚的. 传送门 其实是水题,然而我真是太蠢了... 首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会 ...

  2. [Bzoj 2547] [Ctsc2002] 玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 317  Solved: 152[Submit][Status] ...

  3. BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)

    传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...

  4. BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )

    二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1 ...

  5. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

  6. BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流

    题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...

  7. HDU3081(KB11-N 二分答案+最大流)

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. Gym - 101908G 二分答案+最大流

    After the end of the truck drivers' strike, you and the rest of Nlogônia logistics specialists now h ...

  9. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

随机推荐

  1. 番外篇:因为一个固态导致的——系统重装与JAVA软件环境下载安装配置

    第一步:拆机改装 最近想换个固态硬盘提提速度,就买了个,然后拧下后盖螺丝,将键盘盖拿下,中间有两个根线连着把扣打开就可以了,将新的固态硬盘装到原本的机械硬盘的地方,又买了个光驱托盘改装位将光驱位装上了 ...

  2. 20155308《网络对抗》Exp8 Web基础

    20155308<网络对抗>Exp8 Web基础 实践原理与实践说明 本实践的具体要求有: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  3. 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    20155308<信息安全系统设计基础 嵌入式C语言课堂考试补博客 知识点 置位 ?bits = bits | (1 << 7) ; /* sets bit 7 */ bits |= ...

  4. 20155339 Exp7 网络欺诈防范

    20155339 Exp7 网络欺诈防范 .基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 当连接局域网的时候应该最容易被攻击,比如说连接了一些不清楚是什么的WiFi其实是很容易收 ...

  5. vs如何将工程配置,保存到属性表

    上次讲到新建一个opencv工程的配置过程,整个流程下来还是非常麻烦的.每次新建一个工程都要走这个流程的话就要疯了! 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表 ...

  6. ubuntu 桌面操作系统安装WPS办公软件的方法

    1.打开ubuntu系统自带的firefox软件 2.打开linux.wps.cn,并点击立即下载 3. 点击下载deb安装包 4.进入下载目录,sudo dpkg -i wps-office_10. ...

  7. Solr 后台查询实例 (工作备查)

    有时间再进行整理package xxx.service.impl; import java.util.HashMap; import java.util.Map; import java.util.M ...

  8. 未能使用“Csc”任务的输入参数初始化该任务

    今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...

  9. stl源码剖析 详细学习笔记heap

    // //  heap.cpp //  笔记 // //  Created by fam on 15/3/15. // // //---------------------------15/03/15 ...

  10. sudo apt-get update 去除设置的代理

    今天想装个软件(wine),使用 sudo apt-get update 命令时,发现给出很多Ign 语句,总出现 Connecting to proxy.http://10.0.126.1:1312 ...