当前位置: 首页 > news >正文

洛谷 P2349:金字塔 ← 链式前向星 dfs

【题目来源】
https://www.luogu.com.cn/problem/P2349

【题目描述】
有一盗墓者潜入一金字塔盗宝。当她(难道是 Lara Croft ?)打开一个宝箱的时候,突然冒出一阵烟(潘多拉的盒子?),她迅速意识到形势不妙,三十六计走为上计……由于她盗得了金字塔的地图,所以她希望能找出最佳逃跑路线。地图上标有 N 个室,她现在就在 1 室,金字塔的出口在 N 室。她知道一个秘密:那阵烟会让她在直接连接某两个室之间的通道内的行走速度减半。她希望找出一条逃跑路线,使得在最坏的情况下所用的时间最少。

【输入格式】
输入文件的第一行有两个正整数 N(3≤N≤100)和 M(3≤M≤2000);
N表示金字塔的出口所在的N室;
M表示有 M 行数据,每行有三个数正整数 U 、V 、W,表示直接从 U 室跑到 V 室(V 室跑到 U 室)需要 W(3≤W≤255)秒。

【输出格式】
输出所求的最少时间(单位为秒)。


【输入样例】
7 8
1 2 10
2 3 12
3 4 20
4 7 8
1 7 34
2 5 10
5 6 12
6 4 13

【输出样例】
66

【说明/提示】
样例解释 Sample Explan:
基本上有三种路线:
(1)1→2→3→4→7。
总时间为:10+12+20+8=50,最坏的情况是“ 3→4 ”那一段,要多花 20 秒(因为行走速度减半),所以这条路选最坏需要 70 秒;
(2)1→2→5→6→4→7。
总时间为:10+10+12+13+8=53,最坏的情况是“ 6→4 ”那一段,要多花 13 秒,所以这条路选最坏需要 66 秒;
(3)1→7。
总时间为:34=34,最坏的情况是“ 1→7 ”那一段,要多花 34 秒,所以这条路选最坏需要 68 秒。

【算法代码】

/* 链式前向星存图
e[i] 表示第 i 条边的终点
ne[i] 表示与第 i 条边同起点的前一条边的编号(按边的添加顺序)
h[i] 表示以 i 为起点的当前边的编号(按边的添加顺序)
*/

#include<bits/stdc++.h>
using namespace std;

int n,m;

const int maxn=105;
const int maxm=2005;

// Undirected edges are special directed edges, open double
int e[maxm<<1],ne[maxm<<1],h[maxn],val[maxm<<1],idx;

void add(int a,int b,int w) {
	val[idx]=w,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int ans=0x3f3f3f3f;
void dfs(int from,int cur,int maxv,int sum) { //maxv:max value of current path
	if(sum+maxv>ans) return;
	if(cur==n) {
		ans=min(sum+maxv,ans);
		return;
	}
	for(int j=h[cur]; j!=-1; j=ne[j]) {
		int t=e[j];
		if(t==from) continue;
		dfs(cur,t,max(maxv,val[j]),sum+val[j]);
	}
}

int main() {
	cin>>n>>m;
	memset(h,-1,sizeof(h));
	for(int i=1; i<=m; ++i) {
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dfs(0,1,0,0);
	cout<<ans<<endl;
}

/*
in:
7 8
1 2 10
2 3 12
3 4 20
4 7 8
1 7 34
2 5 10
5 6 12
6 4 13

out:
66
*/


【参考文献】
https://www.luogu.com.cn/problem/solution/P2349
https://blog.csdn.net/qq_44343213/article/details/102957651
https://blog.csdn.net/m0_46304383/article/details/113457800


 

相关文章:

  • Flink—窗口、时间和水印
  • Cadence OrCAD Capture 查找功能详细介绍
  • 物联网病毒Mirai可靠性分析
  • c语言实现数据结构中的单向链表
  • (没学懂,待填坑)【动态规划】数位动态规划
  • 小功能⭐️Unity判断是否单击到了UI
  • 常见的传输介质及其特性
  • 660——第一章
  • vue中计算属性computed的特性和应用
  • UAC实现原理
  • 【通信】Matlab实现多同步压缩变换
  • Element常用api webview
  • C语言结构体小栗子
  • 空间数据结构管理---RTree (下篇,代码实例)
  • 看我炫一下
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Angular Elements 及其运作原理
  • CentOS6 编译安装 redis-3.2.3
  • co.js - 让异步代码同步化
  • css选择器
  • happypack两次报错的问题
  • HashMap剖析之内部结构
  • java2019面试题北京
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Node 版本管理
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • node学习系列之简单文件上传
  • React中的“虫洞”——Context
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • ViewService——一种保证客户端与服务端同步的方法
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 记一次和乔布斯合作最难忘的经历
  • 微服务框架lagom
  • 物联网链路协议
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #pragma data_seg 共享数据区(转)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $forceUpdate()函数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (译)计算距离、方位和更多经纬度之间的点
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失