出题人:朱允刚
单位:吉林大学
假定有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<