Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路
背景
在很久很久以前,有一个动物村庄,那里是猪的乐园(_),村民们勤劳、勇敢、善良、团结……
不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……
描述
这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。
山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走。山是环形的。(注意:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。
晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。
★★★本题为vijos早年陈题,描述晦涩,现重新描述题面如下★★★
有一个数字三角形,共nn行,依次编号为第一行,第二行至第nn行。其中第ii行有ii个数字,位置依次记为(i,1),(i,2)(i,1),(i,2)到(i,i)(i,i)。
现在从第nn层的第一个位置出发(即(n,1)(n,1)),每一步移到相邻的,且行编号小于或等于当前行编号的一个位置中,直到(1,1)(1,1)结束,在不重复经过任何位置的情形下,路过的所有位置(包括端点)的对应数字之和最小。
下面详细定义相邻关系。
同一层内连续的两个位置相邻,特别的有每一层第一个位置与最后一个位置相邻。
对于位置(i,j)(i,j),它与(i-1,j-1)(i−1,j−1)以及(i-1,j)(i−1,j)相邻,特别的(i,1)(i,1)与(i-1,i-1)(i−1,i−1)相邻,且(i,i)(i,i)与(i-1,1)(i−1,1)相邻。
格式
输入格式
第一行有一个数n(2<=n<=1000),表示山的高度。
从第二行至第n+1行,第i+1行有i个数,每个数表示晴天小猪在这一段山路上需要爬的时间。
输出格式
一个数,即晴天小猪所需要的最短时间。
样例1
样例输入1
5
1
2 3
4 5 6
10 1 7 8
1 1 4 5 6
样例输出1
10
题解
这道题目可以看成一道求单源单汇最短路的问题。
我们以左下角的点为起点,最上面的点为终点,对于除终点以外的每个点,我们连接其左、右、左上、上的四个点(特殊规则的点得按特殊规则来),然后按照SPFA算法,开队列来求最短路。
代码:
#include <iostream>
#include <queue>
using namespace std;
struct node
{
int x, y;
};
queue<node> que;
int n, a[1010][1010], f[1010][1010];
bool inMap(int x, int y)
{
return x >= 0 && x < n && y >= 0 && y <= x;
}
void bfs()
{
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
f[i][j] = -1;
f[n-1][0] = a[n-1][0];
node u;
u.x = n-1;
u.y = 0;
que.push(u);
while(!que.empty())
{
node u = que.front();
que.pop();
int ux = u.x, uy = u.y;
if (u.x == 0 && u.y == 0)
{
continue;
}
node v;
// left
if (u.y > 0)
{
v.x = u.x;
v.y = u.y - 1;
}
else
{
v.x = u.x;
v.y = u.x;
}
if (inMap(v.x, v.y) && (f[v.x][v.y] == -1 || f[v.x][v.y] > f[u.x][u.y] + a[v.x][v.y]))
{
f[v.x][v.y] = f[u.x][u.y] + a[v.x][v.y];
que.push(v);
}
// right
if (u.x == u.y)
{
v.x = u.x;
v.y = 0;
}
else
{
v.x = u.x;
v.y = u.y + 1;
}
if (inMap(v.x, v.y) && (f[v.x][v.y] == -1 || f[v.x][v.y] > f[u.x][u.y] + a[v.x][v.y]))
{
f[v.x][v.y] = f[u.x][u.y] + a[v.x][v.y];
que.push(v);
}
// up
if (u.x == u.y)
{
v.x = u.x - 1;
v.y = 0;
}
else
{
v.x = u.x - 1;
v.y = u.y;
}
if (inMap(v.x, v.y) && (f[v.x][v.y] == -1 || f[v.x][v.y] > f[u.x][u.y] + a[v.x][v.y]))
{
f[v.x][v.y] = f[u.x][u.y] + a[v.x][v.y];
que.push(v);
}
// up-left
if (u.y == 0)
{
v.x = u.x - 1;
v.y = v.x;
}
else
{
v.x = u.x - 1;
v.y = u.y - 1;
}
if (inMap(v.x, v.y) && (f[v.x][v.y] == -1 || f[v.x][v.y] > f[u.x][u.y] + a[v.x][v.y]))
{
f[v.x][v.y] = f[u.x][u.y] + a[v.x][v.y];
que.push(v);
}
}
cout << f[0][0] << endl;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++)
for (int j = 0; j <= i; j ++)
cin >> a[i][j];
bfs();
return 0;
}
Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路的更多相关文章
- vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化
题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...
- 【vijos】1006 晴天小猪历险记之Hill(dijkstra)
https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...
- vijosP1006 晴天小猪历险记之Hill
vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...
- Vijos1006P1006晴天小猪历险记之Hill[最短路]
P1006晴天小猪历险记之Hill Accepted 标签:晴天小猪历险记[显示标签] 背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结……不过有一 ...
- hdoj 2066 一个人的旅行 【多源多汇最短路】
题目:hdoj 2066 一个人的旅行 方法:缩点 + 最短路 分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手. 这个题目就是典型的多源多汇最短路 方法:把全部的源点压缩成一个 ...
- POJ - 3268 Silver Cow Party SPFA+SLF优化 单源起点终点最短路
Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to ...
- 晴天小猪历险记之Hill(Dijkstra优先队列优化)
描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助. ...
- 通信网Project之——单源单宿最短路问题
最主要的Vertex类: #ifndef VERTEX_H #define VERTEX_H #include <climits> #include <cstddef> #de ...
- 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路
1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...
随机推荐
- SparkMLlib分类算法之支持向量机
SparkMLlib分类算法之支持向量机 (一),概念 支持向量机(support vector machine)是一种分类算法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最 ...
- 9.Java 加解密技术系列之 RSA
Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...
- mac系统下给文件夹加密方法
电脑里我们往往会有许多隐私的文件,不希望被别人看到,在过去的Windows电脑里,我们习惯性的会在文件夹中将该文件隐藏,但是这个隐藏是不安全的,遇到稍微会点电脑技术的人就可以给你解开,安全性不高,ma ...
- 【js实例】js中的5种基本数据类型和9种操作符
js中的5中基本数据类型 js标识符 第一个字符必须为字母,下划线,或美元符 其他字符可以是字母,下划线,美元符,数字 js标识符区分大小写 标识符不能使关键字和保留字 关键字: break do i ...
- js继承之借用构造函数继承
我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...
- 【JAVAWEB学习笔记】网上商城实战:环境搭建和完成用户模块
网上商城实战 今日任务 完成用户模块的功能 1.1 网上商城的实战: 1.1.1 演示网上商城的功能: 1.1.2 制作目的: 灵活运用所学知识完成商城实战. 1.1.3 ...
- JavaScript设计模式_02_策略模式
在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是所谓的策略模式. /* * pre:策略模式 * 示例:公司计算奖 ...
- 原生和jQuery的ajax用法
jQuery的ajax方法: $.ajax({ url:'/comm/test1.php', type:'POST', //GET async:true, //或false,是否异步 data:{ n ...
- 浅谈卷积神经网络及matlab实现
前言,好久不见,大家有没有想我啊.哈哈.今天我们来随便说说卷积神经网络. 1卷积神经网络的优点 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...
- 非滤波单目视觉slam笔记1
非滤波单目视觉slam 主要分为以下8部分 数据类型 数据关联 初始化 位姿估计 地图维护 地图生成 失效恢复 回环检测 数据类型 直接法(稠密,半稠密) 基本原理是亮度一致性约束,\(J(x,y) ...