背景

在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结……
不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……

描述

这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。
山用一个三角形表示,从山顶依次向下有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;// leftif (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);}// rightif (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);}// upif (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-leftif (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;
}

转载于:https://www.cnblogs.com/xianyue/p/6945294.html

Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路相关推荐

  1. vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化

    题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...

  2. 【vijos】1006 晴天小猪历险记之Hill(dijkstra)

    https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...

  3. vijosP1006 晴天小猪历险记之Hill

    vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...

  4. 单源最短路径(最短路)

    洛谷--P3371 [模板]单源最短路径(spfa) 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个 ...

  5. 18.03.06 vijos1006 晴天小猪历险记之Hill

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  6. Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】

    Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...

  7. 晴天小猪历险记之Hill

    题目描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求 ...

  8. P1006晴天小猪历险记之Hill

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  9. voj1006 晴天小猪历险记之Hill

    背景 Background   在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种 ...

最新文章

  1. 4.4学习笔记-REGEXP1(正则表达式)
  2. 通过属性值从对象数组中获取JavaScript对象[重复]
  3. highcharts一天时间 与一周时间_如何规划自己一天的时间
  4. C语言复习之关键字static的作用
  5. 辛苦了一个下午和晚上,给Blog换了个新皮肤
  6. Python基础教程:如何打破while循环?
  7. JavaScript、Jquery:获取各种屏幕的宽度和高度
  8. windows运行linux脚本命令大全,查看和运行 Windows PowerShell 脚本
  9. C++ writestring 为什么不能写进中文 CStdioFile向无法向文本中写入中文【一】
  10. [渝粤教育] 宁波财经学院 创业机会识别 参考 资料
  11. 洛谷:P1330 封锁阳光大学(二分图染色 + 最小同色点覆盖)
  12. java 自动补全_eclipse自动补全的设置
  13. zotero自定义导出参考文献bib格式
  14. 2018 CVPR:Pyramidal Person Re-IDentification via Multi-Loss Dynamic Training
  15. 不同产品生命周期的营销策略
  16. Android学习-使用WebView在app上显示网页
  17. 网络资产中主机发现方案分析
  18. d盘无法格式化怎么解决
  19. H2.64和H2.65编码区别
  20. 轻断食原理:胰岛素水平

热门文章

  1. AJAX-----03远古时期的ajax
  2. MathJax公式编辑示例
  3. unity Scene窗口RectTool失效,MoveTool只能直线移动不能拖动
  4. WannaCry病毒肆虐全球,唯有这家网络安全公司融资1亿美金却笑不出来
  5. session在PHP中的用法,PHP中session使用方法详解
  6. css表单光标宽度设置,如何改变表单控件光标颜色
  7. RTK+GPS提高定位精度原理解析(一个小白写给另一个小白系列)
  8. java中简单的快速排序_【新手自白书】简单快速排序的实现(JAVA)
  9. mysql半同步和无损复制_mysql主从之半同步复制和lossless无损复制
  10. 2022年最新Mac 安装cocoapods步骤