题目:

Description

飞飞国是一个传说中的国度,国家的居民叫做飞飞侠。飞飞国是一个N×M的矩形方阵,每个格子代表一个街区。然而飞飞国是没有交通工具的。飞飞侠完全靠地面的弹射装置来移动。每个街区都装有弹射装置。使用弹射装置是需要支付一定费用的。而且每个弹射装置都有自己的弹射能力。我们设第i行第j列的弹射装置有Aij的费用和Bij的弹射能力。并规定有相邻边的格子间距离是1。那么,任何飞飞侠都只需要在(i,j)支付Aij的费用就可以任意选择弹到距离不超过Bij的位置了。如下图

(从红色街区交费以后可以跳到周围的任意蓝色街区。) 现在的问题很简单。有三个飞飞侠,分别叫做X,Y,Z。现在它们决定聚在一起玩,于是想往其中一人的位置集合。告诉你3个飞飞侠的坐标,求往哪里集合大家需要花的费用总和最低。

Input

输入的第一行包含两个整数N和M,分别表示行数和列数。接下来是2个N×M的自然数矩阵,为Aij和Bij 最后一行六个数,分别代表X,Y,Z所在地的行号和列号。

Output

第一行输出一个字符X、Y或者Z。表示最优集合地点。第二行输出一个整数,表示最小费用。如果无法集合,只输出一行NO

Sample Input

4 4
0 0 0 0
1 2 2 0
0 2 2 1
0 0 0 0
5 5 5 5
5 5 5 5
5 5 5 5
5 5 5 5
2 1 3 4 2 2

Sample Output

Z
15
【范围】
100% 1 < = N, M < = 150; 0 < = Aij < = 10^9; 0 < = Bij < = 1000

题解:

  这道题主要是建边方式很巧妙···如果直接建边跑迪杰斯特拉是爆空间的···

  我们根据每个点能够弹射的距离S将点拆成S+1个点,分别为g[x][y][0-S],xy为该点坐标··第三维为点的高度··其中高度大于等于1的点只能到达它的上、下、左、右、以及原地的低一层走,且边长为0···然后我们将高度为0的点g[x][y][0]根据弹射的距离S连向点g[x][y][S],边长为它的弹射费用··然后跑三次最短路即可

代码:

  (ps:该代码在bzoj上超空间了··原因是我的单调队列偷懒没用结构体从而多开了几个占空间的数组···懒得改过来了··)

  

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=;
priority_queue< pair<long long,int> >que;
const int Gox[]={,,-,,,};
const int Goy[]={,,,,-,};
long long dis[N][N][*N];
int anss[][],H,val[N][N],len[N][N],n,m,id[N][N][N*],x[],y[],idx[N*N*N*],idy[N*N*N*],idh[N*N*N*];
inline int R(){
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline void getans(int src,int des1,int des2){
bool flag1=false,flag2=false;
while(!que.empty()) que.pop();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=H;k++) dis[i][j][k]=2e+;
dis[x[src]][y[src]][]=;que.push(make_pair(,id[x[src]][y[src]][]));
while(!que.empty()){
int u=que.top().second;que.pop();
if(u==id[x[des1]][y[des1]][]) flag1=true;
if(u==id[x[des2]][y[des2]][]) flag2=true;
if(flag1&&flag2) break;
if(idh[u]>=){
for(int i=;i<=;i++){
int tx=idx[u]+Gox[i],ty=idy[u]+Goy[i];
if(tx>=&&tx<=n&&ty>=&&ty<=m){
if(dis[tx][ty][idh[u]-]>dis[idx[u]][idy[u]][idh[u]]){
dis[tx][ty][idh[u]-]=dis[idx[u]][idy[u]][idh[u]];
que.push(make_pair(-dis[tx][ty][idh[u]-],id[tx][ty][idh[u]-]));
}
}
}
}
else{
int maxx=min(H,len[idx[u]][idy[u]]);
if(dis[idx[u]][idy[u]][maxx]>dis[idx[u]][idy[u]][]+val[idx[u]][idy[u]]){
dis[idx[u]][idy[u]][maxx]=dis[idx[u]][idy[u]][]+val[idx[u]][idy[u]];
que.push(make_pair(-dis[idx[u]][idy[u]][maxx],id[idx[u]][idy[u]][maxx]));
}
}
}
anss[src][des1]=dis[x[des1]][y[des1]][],anss[src][des2]=dis[x[des2]][y[des2]][];
}
int main()
{
//freopen("friend.in","r",stdin);
//freopen("friend.out","w",stdout);
n=R(),m=R();H=max(n,m);int temp=;H*=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=H;k++) id[i][j][k]=++temp,idx[temp]=i,idy[temp]=j,idh[temp]=k;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) len[i][j]=R();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) val[i][j]=R();
for(int i=;i<=;i++) x[i]=R(),y[i]=R();
getans(,,),getans(,,),getans(,,);long long ans=2e+;int pos;
for(int i=;i<=;i++)
{
long long temp=;
for(int j=;j<=;j++){
if(i==j) continue;
temp+=anss[j][i];
}
if(temp<ans) ans=temp,pos=i;
}
if(pos==) cout<<"X"<<"\n";
else if(pos==) cout<<"Y"<<"\n";
else if(pos==) cout<<"Z"<<"\n";
cout<<ans<<"\n";return ;
}

  

刷题总结——飞飞侠(bzoj2143 最短路)的更多相关文章

  1. BZOJ 2143 飞飞侠(分层最短路)

    飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街区都装有弹射装置.使用弹射装置是需要支付一定费用的.而且每个弹射装置都有自己的弹 ...

  2. 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_ ...

  3. BZOJ2143: 飞飞侠

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

  4. hdu-3790最短路刷题

    title: hdu-3790最短路刷题 date: 2018-10-20 14:50:31 tags: acm 刷题 categories: ACM-最短路 概述 一道最短路的水题,,,尽量不看以前 ...

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

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

  6. 【BZOJ 2143】 飞飞侠

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

  7. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  8. OI刷题录——hahalidaxin

    16-3-25  —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...

  9. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

随机推荐

  1. GPU并行编程:内核及函数的实现

    原文链接 回想一下我们之前在设备上使用“kernelFunction<<<1,1>>>(..)”执行一个函数的代码,我在那里还曾说过后面会细说,本文就详细介绍一下参 ...

  2. java程序换图标

    ImageIcon img = new ImageIcon("D:\\mahou-in-action\\ShiJuanFenXi\\src\\zoom-in.png"); inst ...

  3. 关于小程序button控件上下边框的显示和隐藏问题

    问题: 小程序的button控件上下有一条淡灰色的边框,在空件上加上了样式 border:(none/0); 都没办法让button上下的的边框隐藏: 代码如下 <button class=&q ...

  4. 微信小程序的开发——01小程序的执行流程是怎样的?

    作者:叶小钗 转载至:https://www.cnblogs.com/yexiaochai/p/9346043.html 我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是 ...

  5. JS - 箭头函数与 () {} 的作用域

    foo () { // ... } 等价于 foo: function () { // ... } foo: () => { // ... } 范例: // 全局 name = 'zhangsa ...

  6. 项目实战15.1—企业级堡垒机 jumpserver一步一步搭建

    本文收录在Linux运维企业架构实战系列 环境准备 系统:CentOS 7 IP:192.168.10.101 关闭selinux 和防火墙 # CentOS 7 $ setenforce 0 # 可 ...

  7. Iframe父子间元素操作

    1.在父页面 获取iframe子页面的元素 (在同域的情况下 且在http://下测试,且最好在iframe onload加载完毕后 dosomething...) js写法 a.通过contentW ...

  8. nginx平滑升级的过程

    1.开始之前首先查看当前的使用版本以及编译时的参数: [root@www ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.12.2 ...

  9. L2TP用户添加和删除、搜索脚本

    #!/bin/bash #author Template . /etc/init.d/functions DATE_TIME=$(date +%F-%T) FILE_PATH='/etc/ppp/ch ...

  10. php中处理字符串的常见函数

    编写程序的时候,经常要处理字符串,最基本就是字符串的查找,在php检测字符串中是否包含指定字符串可以使用正则,如果你对正则不了解,那么有几个函数可以为您提供方便. 1. strstr strstr() ...