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
ps:感觉题目描述有问题,a和b是反着的
曾经有人告诉我要建分层图,然后我就真建了分层图顺便开了边表
很不幸的是等我开数组一算我的边表貌似要600M+,妥妥的挂掉,推翻重写
后来我就没骨气的点开了hzwer的博客,才知道最短路其实不用建边也能跑
这个题主要是考虑到边太多,150*150*150*150会挂,所以考虑建分层图
将底层的点弹射到云端点,费用为a[i,j],弹射高度为b[i,j]
每个上层点向下层与自己曼哈顿距离为0和1的对应点连边,费用为0,跑迪杰斯特拉(据说卡spfa)
看代码吧,代码清晰易懂
 
 #include<iostream>
#include<cstdio>
#include<queue>
#define inf 1000000000
using namespace std;
char ans;int mn=inf;
int fx[]={,,,-,},fy[]={,-,,,};
int a1,a2,b1,b2,c1,c2;
int n,m,mx;
int x1,y1,x2,y2,x3,y3;
int a[][],b[][];
int d[][][];
bool vis[][][];
struct node{int s,x,y,w;};
bool cmp(node a,node b) {return a.w<b.w;}
bool operator>(node a,node b)
{
return a.w>b.w;
}
void dij(int x,int y){
priority_queue<node,vector<node>,greater<node> > q;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=mx;k++){
vis[i][j][k]=;
d[i][j][k]=inf;
}
vis[x][y][]=;d[x][y][b[x][y]]=a[x][y];
q.push((node){b[x][y],x,y,a[x][y]});//层数,坐标xy,花费
while(!q.empty()&&(!vis[x1][y1][]||!vis[x2][y2][]||!vis[x3][y3][])){
int x=q.top().x,y=q.top().y,s=q.top().s;q.pop();
if(vis[x][y][s]) continue;vis[x][y][s]=;
if(s>){
for (int i=;i<;i++){
int xx=x+fx[i],yy=y+fy[i];
if(xx>n||xx<||yy>m||yy<||vis[xx][yy][s-]) continue;
if(d[x][y][s]<d[xx][yy][s-]){
d[xx][yy][s-]=d[x][y][s];
q.push((node){s-,xx,yy,d[xx][yy][s-]});
}
}
}
else{
int t=b[x][y];
if(d[x][y][t]>d[x][y][]+a[x][y]){
d[x][y][t]=d[x][y][]+a[x][y];
q.push((node){t,x,y,d[x][y][t]});
}
} }
while(!q.empty())q.pop();
} int main(){
scanf("%d%d",&n,&m);mx=n+m-;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&b[i][j]),b[i][j]=min(max(mx-i-j,i+j-),b[i][j]);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%d",&a[i][j]); scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
dij(x1,y1);a1=d[x2][y2][],a2=d[x3][y3][];
dij(x2,y2);b1=d[x1][y1][],b2=d[x3][y3][];
dij(x3,y3);c1=d[x1][y1][],c2=d[x2][y2][];
if(b1+c1<mn) ans='X',mn=b1+c1;
if(a1+c2<mn) ans='Y',mn=a1+c2;
if(a2+b2<mn) ans='Z',mn=a2+b2;
if(mn==inf) {printf("NO\n");return ;}
printf("%c\n",ans);
printf("%d",mn);
}

【BZOJ 2143】 飞飞侠的更多相关文章

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

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

  2. bzoj 2143: 飞飞侠

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

  3. BZOJ2143: 飞飞侠

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

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

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

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

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

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

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

  7. bzoj千题计划225:bzoj2143: 飞飞侠

    http://www.lydsy.com/JudgeOnline/problem.php?id=2143 分层图最短路 把能够弹跳的曼哈顿距离看做能量 dp[i][j][k]表示在(i,j)位置,还有 ...

  8. luogu4473 BZOJ2143 2011[国家集训队]飞飞侠

    题目戳这里 有问题可以在博客@ 应该还会有人来看吧,嘻嘻 正题: 题目大意: 题目很清楚,就是一个点有一定的范围,会有一定的花费 求三个点中的任意两个点到另一个点的最小花费 (麻麻教育我千万读好题目( ...

  9. [BZOJ 1800] 飞行棋

    Link: BZOJ 1800 传送门 Solution: $O(n^4)$…… Code: #include <bits/stdc++.h> using namespace std; ] ...

随机推荐

  1. LeetCode 152

    Maximum Product Subarray Find the contiguous subarray within an array (containing at least one numbe ...

  2. 关于Windows下mysql忘记root密码的解决方法

    原文链接: http://www.cnblogs.com/andy_tigger/archive/2012/04/12/2443652.html 1. 首先检查mysql服务是否启动,若已启动则先将其 ...

  3. 关于Windows下如何查看端口占用和杀掉进程

    更详细博客参见: http://www.cnblogs.com/chenwenbiao/archive/2012/06/24/2559954.html 或可参考:http://www.cnblogs. ...

  4. 误用ArrayListMultimap引发的问题

    最近生产环境的系统在运行一段时间后,用户登录速度越来越慢,但是重启某一模块后,用户登录恢复正常.如此反复,令人提心吊胆.于是下定决心,找出问题原因. 趁着系统运行低峰期,打印出相应Dump文件,发现D ...

  5. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  6. CSS行高--line-height

    遇到的问题:在css中,不理解line-height:1与line-height:1px的区别 发现的过程:最近在学做一个网站的过程中,设置两行文字之间的行高时需要用到line-height,发现了这 ...

  7. (转)工作之路---记录LZ如何在两年半的时间内升为PM

    原文地址:http://www.cnblogs.com/zuoxiaolong/p/life31.html 引言 之前的伪PM纠结之路已经渐渐结束,LZ也终于正式爬上了PM的位置,对于LZ来说,这个时 ...

  8. 去重 oracle

    --去重DELETE FROM DEPR_MONTHS_LIST AWHERE (A.ASSET_ID,A.DEPR_DATE,A.UNIT_COST_ID) IN(SELECT B.ASSET_ID ...

  9. 第二篇、倾力总结40条常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...

  10. Objective-C访问SQLite

    数据库的相关知识我就不去说明了,毕竟只要会sql语言的人就大家都一样. 本案例是在Xcode7.2环境下创建的single view application进行演示操作. 首先第一点,为什么要使用sq ...