BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)
先不考虑只有一个显得有些特殊的天兵。
可以发现超能力的作用实质上是使兵更换职业。每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地方,不会造成其中一个次数增加。
于是预处理出每个兵到达每个位置的最少代价。之后二分答案,把每个兵向可以到达的目标位置连边。跑最大流就可以知道是否可行。
最后考虑天兵。天兵可以任意游走,并且与天兵换职业的兵可以直接到达目的地。那么在最大流的结果上加上二分出的答案即可,因为每次使用超能力都可以送走一个兵。
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玩具兵(最短路径+二分答案+最大流)的更多相关文章
- bzoj2547: [Ctsc2002]玩具兵
划了一天水,其实我还是有点愧疚的. 传送门 其实是水题,然而我真是太蠢了... 首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会 ...
- [Bzoj 2547] [Ctsc2002] 玩具兵
2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 317 Solved: 152[Submit][Status] ...
- BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)
传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...
- BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )
二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- HDU3081(KB11-N 二分答案+最大流)
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Gym - 101908G 二分答案+最大流
After the end of the truck drivers' strike, you and the rest of Nlogônia logistics specialists now h ...
- 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...
随机推荐
- 从CMDB动态获取服务器列表,按照Ansible的约定
目标效果: [root@ansible ~]# python query.py --list{ "test": [ "10.1.2.1", "10.1 ...
- 5-51单片机ESP8266学习-AT指令(8266TCP服务器--用手机TCP调试助手发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8759294.html 源码链接:https://pan.baidu.com/s/1wT8KAOIzvkOXXNpkDI7E8 ...
- JQuery radio单选框应用
转载:JQuery判断radio(单选框)是否选中和获取选中值方法总结 一.利用获取选中值判断选中 直接上代码,别忘记引用JQuery包 复制代码 代码如下: < !DOCTYPE html P ...
- 2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——操作文件
已经学习了基本的命令,现在是时候学习操作文件了,这也是命令行的重要任务.还是基于本教程的事先规定,本教程是入门级的,不要求熟悉类似编辑文本的程序(这些文本编辑程序,将在下个系列教程中介绍, Learn ...
- 【spring】spirng中的常用工具类
一.概述 很多时候,很多工具类其实spring中就已经提供,常用的工具类有: 参考:https://www.cnblogs.com/langtianya/p/3875103.html 内置的resou ...
- 20155237 2016-2017-2《Java程序设计》课程总结
20155237 2016-2017-2<Java程序设计>课程总结 预备作业1 刚接触Markdown的写法,初写博客,简单了解娄老师的教学方式. 预备作业2 怎么将学习java像学习一 ...
- # 2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范
2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范 一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2. ...
- # 2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析
2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析 实验目标与基础问题 ++1.实践目标++ 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析 ...
- JavaScript 变量提升
变量提升(Hoisting):在ES6之前,函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端. 注意: 1. JavaScript 仅提升声明,而不 ...
- package.json 中 npm 依赖包版本前的符号的意义
版本的格式 major.minor.patch:主版本号.次版本号.修补版本号 patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 major:新增功能,不兼容老版本 version ...