L3-1 超级玛丽 (30 分)

这篇博客介绍了如何利用迪杰斯特拉算法和堆优化来解决一个超级玛丽游戏中的路径规划问题。给定n个城堡、起点s、终点t和m条道路,马里奥有一个魔法棒可以瞬间穿越一条道路。博客详细阐述了如何找到最短时间和最佳魔法棒使用位置,以确保马里奥能在最短时间内到达目的地。
摘要由CSDN通过智能技术生成

出题人:朱允刚
单位:吉林大学
假定有n个城堡,编号为1至n,有的城堡之间有道路直接相连,有的城堡之间没有道路直接相连。马里奥现在准备从一个城堡出发前往另一个城堡,它有一个魔法棒,可以瞬时通过一条道路,即以0时间通过这条道路,但魔法棒最多只能用一次。马里奥想以最短的时间到达目的地,请编写程序为马里奥选定一条路线以及在什么地方使用魔法棒。假定所有道路为双向,保证从起点肯定能到达目的地。
在这里插入图片描述

输入格式

输入第一行为4个整数n、s、t、m,分别表示城堡数(编号为1至n,n不超过10000),马里奥所在的起点s和想去的终点t,城堡间的道路数目。接下来m行,每行为3个正整数a、b、c,表示城堡a和城堡b之间有一条道路直接相连,通过该道路需要c分钟。

输出格式

输出为空格间隔的2个整数,第1个整数为马里奥从起点到目的地所需的最短时间;第2个整数表示使用魔法棒的地点,即城堡编号,若有多个可能的地点,则输出编号最小者。

输入样例

4 1 4 4
1 2 9
2 4 1
1 3 3
3 4 5

输出样例

1 1

思路

迪杰斯特拉算法,不过本题数据范围大,需要进行堆优化,利用优先队列priority_queue进行堆优化,调用两次迪杰斯特拉求出起始点、终止点到各点的最短距离,之后再找出哪条路径最短

#include <bits/stdc++.h>
#define INF 0x7ffffff
#define x first
#define y second
using namespace std;

unordered_map<string, vector<pair<string, int>>> g;
unordered_map<string, int> vis;
vector<pair<string, string>> v<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值