飞飞国是一个N×M的矩形方阵,每个格子代表一个街区。然而飞飞国是没有交通工具的。飞飞侠完全靠地面的弹射装置来移动。每个街区都装有弹射装置。使用弹射装置是需要支付一定费用的。而且每个弹射装置都有自己的弹射能力。我们设第i行第j列的弹射装置有Aij的费用和Bij的弹射能力。并规定有相邻边的格子间距离是1。那么,任何飞飞侠都只需要在(i,j)支付Aij的费用就可以任意选择弹到距离不超过Bij的位置了。现在的问题很简单。有三个飞飞侠,分别叫做X,Y,Z。现在它们决定聚在一起玩,于是想往其中一人的位置集合。告诉你3个飞飞侠的坐标,求往哪里集合大家需要花的费用总和最低。

考虑直接建图,点n*m,边n*n*m*m,不可行。

考虑将整个矩形再加一维,表示高度,那么对于最下面一层的点,连向的边是他对应Bij的高度,然后其他的点就向相邻位置的下一层连边。

这样点n*m*(maxBij),边n*m*(maxBij)*5.

实际上maxBij只要超过(n+m)的时候就可以到达图上任意一点,所以实际上maxBij只会<=(n+m).

然后对于三个飞飞侠跑三遍最短路即可。

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <bitset>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FDR(i,a,n) for(int i=a; i>=n; --i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
inline int Scan() {
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
inline void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin.... int A[N][N], B[N][N], ps[][]={,,-,,,,,-,,};
int n, m, node[];
LL dist[N*N*N*], d[][];
bool vis[N*N*N*];
struct qnode{
int v;
LL c;
qnode(int _v=, LL _c=):v(_v),c(_c){}
bool operator<(const qnode &r)const{return c>r.c;}
};
priority_queue<qnode>que;
const LL P=1LL<<; int get_id(int x, int y, int z){return n*m*(z-)+(y-)*n+(x-);}
void Dijkstra(int nn, int start){
int u, x, y, z, px, py, pz, id;
mem(vis,false);
FOR(i,,nn) dist[i]=P;
dist[node[start]]=;
while (!que.empty()) que.pop();
que.push(qnode(node[start],));
qnode tmp;
while (!que.empty()) {
if (dist[node[]]!=P && dist[node[]]!=P && dist[node[]]!=P) break;
tmp=que.top(); que.pop();
u=tmp.v;
if (vis[u]) continue;
vis[u]=true;
z=u/(n*m)+; y=(u%(n*m))/n+; x=u%(n*m)%n+;
if (z==) {
pz=min(n+m,+B[x][y]); id=get_id(x,y,pz);
if (!vis[id]&&dist[id]>dist[u]+A[x][y]) dist[id]=dist[u]+A[x][y], que.push(qnode(id,dist[id]));
}
else {
FOR(i,,) {
px=x+ps[i][]; py=y+ps[i][];
if (px<=||px>n||py<=||py>m) continue;
id=get_id(px,py,z-);
if (!vis[id]&&dist[id]>dist[u]) dist[id]=dist[u], que.push(qnode(id,dist[id]));
}
}
}
FOR(i,,) d[start][i]=dist[node[i]];
}
int main ()
{
int x, y;
n=Scan(); m=Scan();
FOR(i,,n) FOR(j,,m) B[i][j]=Scan();
FOR(i,,n) FOR(j,,m) A[i][j]=Scan();
FOR(i,,) x=Scan(), y=Scan(), node[i]=get_id(x,y,);
FOR(i,,) Dijkstra(n*m*(n+m+),i);
LL ans=P;
int p;
FOR(i,,) if (ans>d[][i]+d[][i]+d[][i]) ans=d[][i]+d[][i]+d[][i], p=i;
if (ans==P) puts("NO");
else {
if (p==) puts("X");
else if (p==) puts("Y");
else puts("Z");
printf("%lld\n",ans);
}
return ;
}

BZOJ 2143 飞飞侠(分层最短路)的更多相关文章

  1. bzoj 2143: 飞飞侠

    #include<cstdio> #include<iostream> #include<queue> #define inf 1000000000 #define ...

  2. 刷题总结——飞飞侠(bzoj2143 最短路)

    题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...

  3. 2018.11.05 bzoj2143: 飞飞侠(最短路)

    传送门 最短路好题. 考虑对每个二维坐标建立一个高度属性. 这样每次如果在点(i,j,0)(i,j,0)(i,j,0)只能选择花费bi,jb_{i,j}bi,j​跳向(i,j,ai,j)(i,j,a_ ...

  4. BZOJ2143: 飞飞侠

    2143: 飞飞侠 题意: 给出两个 n ∗ m 的矩阵 A,B,以及 3 个人的坐标 在 (i, j) 支付 Ai,j 的费用可以弹射到曼哈顿距离不超过 Bi,j 的位置 问三个人汇合所需要的最小总 ...

  5. 【BZOJ 2143】 飞飞侠

    Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街区都装有 ...

  6. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  7. BZOJ:2763-[JLOI2011]飞行路线(最短路分层图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 解题心得: 第一次见到分层最短路.其实题中说选择k条路径免费,那怎么选k条路径并没 ...

  8. BZOJ2143 飞飞侠 & [校内NOIP2018模拟20181026] 最强大脑

    Time Limit: 50 Sec Memory Limit: 259 MB Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街 ...

  9. Luogu 4473 [国家集训队]飞飞侠

    BZOJ 2143 新技能:并查集优化最短路. 暴力最短路是$O(n^4)$的,然后拿个线段树优化一下连边就$O($能过$)$了. 但是这样都太慢了. 我们考虑一个点如果之前被更新过了,那么之后就不会 ...

随机推荐

  1. 可视化分析 web 访问日志

    内容目录 Python 基础 使用模块介绍 可视化组件 echarts 介绍 Web 访问日志 代码解读 讲师:KK 多语言混搭开发工程师,多年 PHP.Python 项目开发经验,曾就职 360.绿 ...

  2. 最具有性价比的语言javascript之介绍篇

    虽然最近几年javascript很火.但很多程序员对javascript重视程度不够,所以对javascript的高级应用不甚了解.认为javascript仅仅只是一门脚本语言,作用就是表单验证,网页 ...

  3. idou老师教你学Istio:如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

  4. idea配置SOLServer错误解决记录

    1.错误信息:2019-03-26 13:32:41.205 ERROR 7828 --- [nio-8081-exec-1] c.alibaba.druid.filter.stat.StatFilt ...

  5. 用adb来修改android嵌入式设备的system只读目录下的东西

    转的一篇: 以修改hosts文件为例: 由于某些原因,可能需要指定域名对应的IP地址.Android是基于Linux的系统,与Linux类似,通过hosts文件来设置. 在Android下,/etc是 ...

  6. linux下实现压测-html报表生成-控制台参数优化【jmeter】

    jmeter - 单机压测 - 命令行模式-html报表生成-控制台参数优化 一/ 准备工作 1.压力机安装并配置好 jdk 2.调试好程序脚本 再上传到 linux下 3.进入jmeter  bin ...

  7. 用可道云kodexplorer在dedecms系统网站上秒建私人网盘

    国内草根站长用的最多的一款建站源程序就是dedecms,通常是通过FTP或者服务器面板自带的文件管理器来上传下载的.FTP可视性.体验都相对差一点,且需要事先安装FTP软件,更换环境后的站点管理上有很 ...

  8. Firefox浏览器【书签工具栏】里的网址链接无法删除的解决办法

    今天使用Firefox浏览器,发现有一些我从来都没有访问的网站出现在[书签工具栏], 也不知道是什么原因被添加进来的(可能是安装某个插件被插的),于是点删除,发现还删除不了,很是老火,研究了一番,把删 ...

  9. Redux 入门教程(一):基本用法

    转自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html(仅供个人学习使用) 首先明确一点, ...

  10. linux命令系列 grep

    grep, egrep, fgrep - print lines matching a pattern SYNOPSIS grep [OPTIONS] PATTERN [FILE...] grep [ ...