题目戳这里

有问题可以在博客@

应该还会有人来看吧,嘻嘻


正题:

题目大意:

题目很清楚,就是一个点有一定的范围,会有一定的花费

求三个点中的任意两个点到另一个点的最小花费

(麻麻教育我千万读好题目(>_<)~)

思路

很容易想到跑最短路,但是建边的话,根本存不下来

所以我们直接存点的坐标,然后直接遍历范围内每个点就好了(遍历是看图找规律吧,反正我动脑子看不出来)

跑一边最短路就好了

bzoj完全没问题,这里指luogu

spfa?他好像又死了(o2水过)

堆优化迪杰斯特拉是个好东西

我是先写的spfa,然后改了改一丢丢就写成了迪杰斯特拉,感觉他俩好像啊

下面是dijkstar和死了的spfa

代码:堆优化迪杰斯特拉

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
#define maxn 155
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[maxn][maxn];
int b[maxn][maxn];
int dis[maxn][maxn];
int x[4],y[4];
int PKU[4][4];
struct node
{
int x,y,q;
node(int xx,int yy,int qq)
{
x=xx;y=yy;
q=qq;
}
bool operator < (const node &a) const
{
return q>a.q;
}
};
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=(x<<3)+(x<<1)+s-'0';s=getchar();}
return x*f;
}
void dijstra(int js)
{
memset(dis,inf,sizeof(dis));
priority_queue<node> q;
q.push(node(x[js],y[js],0));
dis[x[js]][y[js]]=0;
while(!q.empty())
{
node u=q.top();
q.pop();
if(dis[u.x][u.y]!=u.q) continue;
int len=b[u.x][u.y];
int v=dis[u.x][u.y]+a[u.x][u.y];
for(int i=max(1,u.x-len);i<=min(n,u.x+len);++i)
{
int tmp=len-abs(u.x-i);
for(int j=max(1,u.y-tmp);j<=min(m,u.y+tmp);j++)
{
if(dis[i][j] > v)
{
dis[i][j] = v;
q.push(node(i,j,dis[i][j]));
}
}
}
}
for(int i=1;i<=3;++i) PKU[js][i]=dis[x[i]][y[i]];
}
int main(int argc, char const *argv[])
{
n=read();m=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
b[i][j]=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
a[i][j]=read();
for (int i = 1; i <= 3; ++i)
{
x[i]=read();
y[i]=read();
}
for(int i=1;i<=3;++i) dijstra(i);
int id=0,ans=inf;
for(int i=1;i<=3;++i)
{
int tm=PKU[1][i]+PKU[2][i]+PKU[3][i];
if(ans>tm) ans=tm,id=i;
}
if(ans==inf) return puts("NO"),0;
if(id==1) puts("X");
if(id==2) puts("Y");
if(id==3) puts("Z");
printf("%d",ans);
return 0;
}

代码:spfa

	#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
#define maxn 155
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[maxn][maxn];
int b[maxn][maxn];
int dis[maxn][maxn];
int vis[maxn][maxn];
int x[4],y[4];
int PKU[4][4];
struct node
{
int x,y;
node(int xx,int yy)
{
x=xx;y=yy;
}
};
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=(x<<3)+(x<<1)+s-'0';s=getchar();}
return x*f;
}
void spfa(int js)
{
memset(dis,inf,sizeof(dis));
queue<node> q;
q.push(node(x[js],y[js]));
dis[x[js]][y[js]]=0;
while(!q.empty())
{
node u=q.front();
q.pop();vis[u.x][u.y]=0;
int len=b[u.x][u.y];
int v=dis[u.x][u.y]+a[u.x][u.y];
for(int i=max(1,u.x-len);i<=min(n,u.x+len);++i)
{
int tmp=len-abs(u.x-i);
for(int j=max(1,u.y-tmp);j<=min(m,u.y+tmp);j++)
{
if(dis[i][j] > v)
{
dis[i][j] = v;
if(!vis[i][j])
{
vis[i][j]=1;
q.push(node(i,j));
}
}
}
}
}
for(int i=1;i<=3;++i) PKU[js][i]=dis[x[i]][y[i]];
}
int main(int argc, char const *argv[])
{
n=read();m=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
b[i][j]=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
a[i][j]=read();
for (int i = 1; i <= 3; ++i)
{
x[i]=read();
y[i]=read();
}
for(int i=1;i<=3;++i) spfa(i);
int id=0,ans=inf;
for(int i=1;i<=3;++i)
{
int tm=PKU[1][i]+PKU[2][i]+PKU[3][i];
if(ans>tm)
{
ans=tm;
id=i;
}
}
if(ans==inf)
return puts("NO"),0;
if(id==1)
puts("X");
if(id==2)
puts("Y");
if(id==3)
puts("Z");
printf("%d",ans);
return 0;
}

厚颜无耻的骗波赞( • ̀ω•́ )✧

luogu4473 BZOJ2143 2011[国家集训队]飞飞侠的更多相关文章

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

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

  2. happiness[国家集训队2011(吴确)]

    [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...

  3. COGS1882 [国家集训队2011]单选错位

    ★   输入文件:nt2011_exp.in   输出文件:nt2011_exp.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...

  4. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

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

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

  6. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  7. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  8. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

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

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

随机推荐

  1. Python开发【算法】:斐波那契数列两种时间复杂度

    斐波那契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, ...

  2. compass利用koala在chrome开启scss调试

    compass不生成maps文件,所载调试css上,极不方便.看到下图的调试方式,怎么做. 利用用koala来解决,具体步骤如下: 1.确保自己安装了ruby和sass,compass.接着安装 co ...

  3. 淡入淡出(折叠效果)and点击切换背景图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. android 操作SD卡上的文件

    (1)说明:操作SD卡上的文件须要增加下面权限  在SD卡上创建和删除文件权限  <uses-permission android:name="android.permission.M ...

  5. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

    Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...

  6. iphone传照片还是用QQ比较好

    之前设置相机格式为高效,通过用91助手的苹果助手导出来文件格式为HEIC,window下没法打开.网上介绍用微信传,发现传的是缩略图,不清楚.最后选择通过qq传比较高清.注意,如果从相册中进行选择的话 ...

  7. go for cryptocurrency

    https://blog.conformal.com/category/btcd/ https://github.com/btcsuite/btcd/tree/master/docs https:// ...

  8. SDUT1157:小鼠迷宫问题(bfs+dfs)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1157 题目描述 小鼠a与小鼠b身处一个m×n的 ...

  9. 2018-2019-2 网络对抗技术 20165324 Exp1:PC平台逆向破解

    2018-2019-2 网络对抗技术 20165324 Exp1:PC平台逆向破解 实验: 要求: 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 掌握反汇编与十六进制编 ...

  10. CMPXCHG指令

    一.CMPXCHG汇编指令详解. 这条指令将al\ax\eax\rax中的值与首操作数比较: 1.如果相等,第2操作数的直装载到首操作数,zf置1.(相当于相减为0,所以0标志位置位) 2.如果不等, ...