描述

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

山用一个三角形表示,从山顶依次向下有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. C4.5决策树-为什么可以选用信息增益来选特征

    要理解信息增益,首先要明白熵是什么,开始很不理解熵,其实本质来看熵是一个度量值,这个值的大小能够很好的解释一些问题. 从二分类问题来看,可以看到,信息熵越是小的,说明分类越是偏斜(明确),可以理解为信 ...

  2. 【模板】Splay(伸展树)普通平衡树(数据加强版)/洛谷P6136

    题目链接 https://www.luogu.com.cn/problem/P6136 题目大意 需要写一种数据结构,来维护一些非负整数( \(int\) 范围内)的升序序列,其中需要提供以下操作: ...

  3. kafka安装(单机版)

    一.安装kafka(单机版) 因为现在的kafka安装包都自带zookeeper,所以如果是安装本地单机版kafka,不需要额外去安装zookeeper,使用自带的就可以了. 1.下载kafka 2. ...

  4. 100个Shell脚本——【脚本7】批量建立用户

    [脚本7]批量建立用户 编写shell脚本,批量建立用户user_00, user_01, ... user_100并且所有用户同属于users组. 一.脚本 #!/bin/bash group=`c ...

  5. Oracle中dbms_random包详解

    Oracle之DBMS_RANDOM包详解参考自:https://www.cnblogs.com/ivictor/p/4476031.html https://www.cnblogs.com/shen ...

  6. vim编码设置(转)

    vim里面的编码主要跟三个参数有关:enc(encoding).fenc(fileencoding).fence(fileencodings) fenc是当前文件的编码,也就是说,一个在vim里面已经 ...

  7. Java中特殊的类——Object类

    Java中特殊的类--Object类 1.Object类的概述 Object类是java默认提供的类.Java中除了Object类,所有的类都是有继承关系的.默认会继承Object类,即所有的对象都可 ...

  8. Dubbo服务调用超时

    服务降级的发生,其实是由于消费者调用服务超时引起的,即从发出调用请求到获取到提供者的响应结果这个时间超出了设定的时限.默认服务调用超时时限为1秒.可以在消费者端与提供者端设置超时时限. 一.创建提供者 ...

  9. Spring Boot中注解@ConfigurationProperties

    在Spring Boot中注解@ConfigurationProperties有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景.本篇文章带大家了解一下三种场景的使用情况. 场景一 使用@ ...

  10. 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决

    前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...