晴天小猪历险记之Hill(Dijkstra优先队列优化)
描述
这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。
山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走。山是环形的。(注意:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。
晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。
格式
输入格式
第一行有一个数n(2<=n<=1000),表示山的高度。
从第二行至第n+1行,第i+1行有i个数,每个数表示晴天小猪在这一段山路上需要爬的时间。
输出格式
一个数,即晴天小猪所需要的最短时间。
限制
各个测试点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优先队列优化)的更多相关文章
- Vijos1006P1006晴天小猪历险记之Hill[最短路]
P1006晴天小猪历险记之Hill Accepted 标签:晴天小猪历险记[显示标签] 背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结……不过有一 ...
- 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛
传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...
- vijosP1006 晴天小猪历险记之Hill
vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...
- 【bzo1579】拆点+dijkstra优先队列优化+其他优化
题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少 ...
- 最短路--dijkstra+优先队列优化模板
不写普通模板了,还是需要优先队列优化的昂 #include<stdio.h> //基本需要的头文件 #include<string.h> #include<queue&g ...
- (模板)poj2387(dijkstra+优先队列优化模板题)
题目链接:https://vjudge.net/problem/POJ-2387 题意:给n个点(<=1000),m条边(<=2000),求结点n到结点1的最短路. 思路:dijkstra ...
- 【vijos】1006 晴天小猪历险记之Hill(dijkstra)
https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...
- Dijkstra + 优先队列优化 模板
#include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...
- Dijkstra优先队列优化
Dijkstra算法的核心思想就是两步排序,一个是对于一个点而言,他的最小边要经过所有其他点最小边的测试才能确认,也就是说要在这其中找一个最大的边出来:第二个是对于每次循环而言的,每次的更新d数组都是 ...
随机推荐
- python2 第二天
requests库 编码和解码 输入和输出,在Python中,为了更好的调试和输出,我们需要对字符串进⾏格式化的输出,⽐如我们定义了姓名和年龄,但是我 们需要输出完整的信息,那么就涉及到字符串格式化的 ...
- 学习java 7.11
学习内容: 泛型定义格式:<类型> 优点:把运行时期的问题提前到编译期间:避免了强制类型转换 泛型方法:public class Fanxing { public <T> ...
- day04 sersync实时同步和ssh服务
day04 sersync实时同步和ssh服务 sersync实时同步 1.什么是实时同步 实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器. 2.为什么使 ...
- Oracle参数文件—pfile与spfile
oracle的参数文件:pfile和spfile 1.pfile和spfile Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, ...
- Linux基础命令---dig工具
dig dig是一个DNS查询工具,多数管理员会使用dig命令来解决DNS的问题. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 di ...
- Linux基础命令---htpasswd创建密码文件
htpasswd htpasswd指令用来创建和更新用于基本认证的用户认证密码文件.htpasswd指令必须对密码文件有读写权限,否则会返回错误码. 此命令的适用范围:RedHat.RHEL.Ubun ...
- 一个统计 CPU 内存 硬盘 使用率的shell脚本
一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 #!/bin/bash #This script is use for describle CPU Hard Memery Uti ...
- springboot-MVC 过滤器使用
一.前言 一下代码以SSO用户登录列子代码.完整代码https://gitee.com/xuxueli0323/xxl-sso 二.使用 2.1 创建过滤器 创建一个过滤器,实现Filter 接口 p ...
- Synchronized深度解析
概览: 简介:作用.地位.不控制并发的影响 用法:对象锁和类锁 多线程访问同步方法的7种情况 性质:可重入.不可中断 原理:加解锁原理.可重入原理.可见性原理 缺陷:效率低.不够灵活.无法预判是否成功 ...
- 【JAVA今法修真】 第二章 一气化三清 线程分心念
这是我的微信公众号,希望有兴趣的朋友能够一起交流,也希望能够多多支持新人作者,你的每一份关注都是我写文章的动力:南橘ryc 天有八纪,地分九州,万法仙门与天道剑宗一并坐落在东北方通辽州. 与李小庚想象 ...