描述

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

山用一个三角形表示,从山顶依次向下有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. LeetCode缺失的第一个正数

    LeetCode 缺失的第一个正数 题目描述 给你一个未排序的整数数组 nums,请你找出其中没有出现的最小的正整数. 进阶:你可以实现时间复杂度为 O(n)并且只使用常数级别额外空间的解决方案吗? ...

  2. A Child's History of England.47

    CHAPTER 13 ENGLAND UNDER RICHARD THE FIRST, CALLED THE LION-HEART In the year of our Lord one thousa ...

  3. lambda表达式快速创建

    Java 8十个lambda表达式案例 1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable( ...

  4. 【Linux】【Shell】【text】grep

    grep: Global search REgular expression and Print out the line. 作用:文本搜索工具,根据用户指定的"模式(过滤条件)" ...

  5. 【Java 8】Stream.distinct() 列表去重示例

    在这篇文章里,我们将提供Java8 Stream distinct()示例. distinct()返回由该流的不同元素组成的流.distinct()是Stream接口的方法. distinct()使用 ...

  6. centos 7 zookeeper 单体和集群搭建

    1.操作相关命令 1.0  安装命令     wget  :下载解压包 tar -xzvf  :解压 1.1  创建节点 create  / node : 创建一个名字为node的 空节点 creat ...

  7. java多线程3:synchronized

    线程安全 多个线程共同访问一个对象的实例变量,那么就可能出现线程不安全的问题. 先看一段代码示例,定义一个对象 MyDomain1 public class MyDomain1 { private i ...

  8. Redis5.0.8 Cluster集群部署

    目录 一.Redis Cluster简介 二.部署 三.创建主库 一.Redis Cluster简介 Redis Cluster集群是一种去中心化的高可用服务,其内置的sentinel功能可以提供高可 ...

  9. PHP安装sqlsrv扩展( Centos系统、或宝塔面板)

    最近新安装了一台Centos服务器, 由于软件使用PHP + sqlserver , 因此需要给PHP安装一个sqlsrv扩展, 虽然这个扩展自己也安装过很多次了,但是从来都没有记录下来过,导致偶尔还 ...

  10. 位置式PID讲解

    table { margin: auto } 一.公式拆解 \(PID\)公式展示: \[u(t)=K_p(e(t)+\frac{1}{T_t } ∫_0^te(t)dt+T_D \frac {de( ...