描述

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

山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走。山是环形的。(注意:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。

晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。

格式

输入格式

第一行有一个数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

限制

各个测试点1s

思路:最短路,关键是建图,建图之后用Dijkstra优先队列优化最短路一下即可。

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<queue>
5 #include<stdlib.h>
6 #include<string.h>
7 #include<queue>
8 #include<vector>
9 using namespace std;
10 void dj(int n,int ans);
11 typedef long long LL;
12 int ma[1002][1002];
13 int biao[1002][1002];
14 int d[600000];
15 typedef struct node
16 {int to;
17 int cost;
18 bool operator<(node&cx)const
19 {
20 return cx.cost<cost;
21 }
22 }ss;
23 typedef pair<int,int>P;
24 vector<ss>vec[600000];
25 priority_queue<P,vector<P>,greater<P> >que;
26 int main(void)
27 {
28 int i,j,k,p,q;
29 scanf("%d",&k);
30 int cnt=1;
31 for(i=1; i<=k; i++)
32 {
33 for(j=1; j<=i; j++)
34 {
35 scanf("%d",&ma[i][j]);
36 biao[i][j]=cnt++;
37 }
38 }ss MM;
39 for(i=k; i>=2; i--)
40 {
41 for(j=1; j<=i; j++)
42 {
43 if(j==1)
44 {
45 int x=biao[i][j];
46 int y=biao[i][j+1];
47 int z=biao[i][i];
48 int xx=biao[i-1][j];
49 int uu=biao[i-1][i-1];
50 MM.to=y;MM.cost=ma[i][j+1];
51 vec[x].push_back(MM);
52 MM.to=z;MM.cost=ma[i][i];
53 vec[x].push_back(MM);
54 MM.to=xx;MM.cost=ma[i-1][j];
55 vec[x].push_back(MM);
56 MM.to=uu;MM.cost=ma[i-1][i-1];
57 vec[x].push_back(MM);
58 }
59 if(j==i)
60 {
61 int x=biao[i][j];
62 int y=biao[i][j-1];
63 int z=biao[i-1][j-1];
64 int xx=biao[i][1];
65 int yy=biao[i-1][1];
66 MM.to=y;MM.cost=ma[i][j-1];
67 vec[x].push_back(MM);
68 MM.to=z;MM.cost=ma[i-1][j-1];
69 vec[x].push_back(MM);
70 MM.to=xx;MM.cost=ma[i][1];
71 vec[x].push_back(MM);
72 MM.to=yy;MM.cost=ma[i-1][1];
73 vec[x].push_back(MM);
74 }
75 else
76 {
77 int x=biao[i][j];
78 int y=biao[i][j-1];
79 int z=biao[i][j+1];
80 int xx=biao[i-1][j];
81 int yy=biao[i-1][j-1];
82 MM.to=y;MM.cost=ma[i][j-1];
83 vec[x].push_back(MM);
84 MM.to=z;MM.cost=ma[i][j+1];
85 vec[x].push_back(MM);
86 MM.to=xx;MM.cost=ma[i-1][j];
87 vec[x].push_back(MM);
88 MM.to=yy;MM.cost=ma[i-1][j-1];
89 vec[x].push_back(MM);
90 }
91 }
92 }dj(k,biao[k][i]);
93 printf("%d ",d[1]);
94 return 0;
95 }
96 void dj(int n,int ans)
97 { int N=1e8;
98 fill(d,d+600000,N);
99 d[ans]=ma[n][1];
100 que.push(P(d[ans],ans));
101 while(!que.empty())
102 {P UU=que.top();que.pop();
103 int v=UU.second;
104 if(d[v]<UU.first)continue;
105 for(int i=0;i<vec[v].size();i++)
106 {
107 node K=vec[v][i];;
108 if(K.cost+d[v]<d[K.to])
109 {
110 d[K.to]=K.cost+d[v];
111 que.push(P(d[K.to],K.to));
112 }
113 }
114 }
115 }

晴天小猪历险记之Hill(Dijkstra优先队列优化)的更多相关文章

  1. Vijos1006P1006晴天小猪历险记之Hill[最短路]

    P1006晴天小猪历险记之Hill Accepted 标签:晴天小猪历险记[显示标签]     背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结……不过有一 ...

  2. 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛

    传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...

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

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

  4. 【bzo1579】拆点+dijkstra优先队列优化+其他优化

    题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少 ...

  5. 最短路--dijkstra+优先队列优化模板

    不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue&g ...

  6. (模板)poj2387(dijkstra+优先队列优化模板题)

    题目链接:https://vjudge.net/problem/POJ-2387 题意:给n个点(<=1000),m条边(<=2000),求结点n到结点1的最短路. 思路:dijkstra ...

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

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

  8. Dijkstra + 优先队列优化 模板

    #include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...

  9. Dijkstra优先队列优化

    Dijkstra算法的核心思想就是两步排序,一个是对于一个点而言,他的最小边要经过所有其他点最小边的测试才能确认,也就是说要在这其中找一个最大的边出来:第二个是对于每次循环而言的,每次的更新d数组都是 ...

随机推荐

  1. Python获取随机数

    Python当中,可用random模块来获取随机数 import random """ random模块,用于获取随机数 """ print ...

  2. 学习java的第十五天

    一.今日收获 1.完成了手册第二章没有验证完成的例题 2.预习了第三章的算法以及for语句与if语句的用法 二.今日难题 1.验证上出现问题,没有那么仔细. 2.第二章还有没有完全理解的问题 三.明日 ...

  3. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  4. Spark(六)【RDD的血缘依赖】

    RDD依赖关系 1. RDD血缘关系 ​ RDD只支持粗粒度转换,即在大量记录上执行的单个操作.将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区.RDD的Lineage会记录RD ...

  5. 转 Android Lifecycle、ViewModel和LiveData

    转自:https://www.jianshu.com/p/982545e01d0a 1.概述 在I / O '17的时候,其中一个重要的主题是Architecture Components.这是一个官 ...

  6. RTTI (Run-time type information) in C++

    In C++, RTTI (Run-time type information) is available only for the classes which have at least one v ...

  7. win10安装两台mysql-5.7.31实例

    1. 下载 mysql5.7.31 压缩包: (1)百度云下载: 链接:https://pan.baidu.com/s/1jgxfvIYzg8B8ahxU9pF6lg 提取码:fiid (2)官网下载 ...

  8. LocalDate计算两个日期相差天数

    import org.apache.commons.lang.StringUtils; import java.time.LocalDate; import java.time.ZoneId; imp ...

  9. MySQL 用户权限相关命令

    ##1.创建用户: create user test identified by '123456';##identified后面跟密码 ##2.查询所有用户: select user from mys ...

  10. 【力扣】454. 四数相加 II

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...