<—点个赞吧QwQ
宣传一下算法基础课整理
给定一个 $n$ 个点 $m$ 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。
请你求出 $1$ 号点到 $n$ 号点的最短距离,如果无法从 $1$ 号点走到 $n$ 号点,则输出 $-1$。
输入格式
第一行包含整数 $n$ 和 $m$。
接下来 $m$ 行每行包含三个整数 $x,y,z$,表示存在一条从点 $x$ 到点 $y$ 的有向边,边长为 $z$。
输出格式
输出一个整数,表示 $1$ 号点到 $n$ 号点的最短距离。
如果路径不存在,则输出 $-1$。
数据范围
$1 \le n,m \le 1.5 \times 10^5$,
图中涉及边长均不小于 $0$,且不超过 $10000$。
数据保证:如果最短路存在,则最短路的长度不超过 $10^9$。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
思路
这题和$\text{Dijkstra求最短路I}$思路是一样的,就是把枚举选哪个点改成用优选队列来维护最短的长度,还要把迭代换成优先队列是否为空即可。
代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair <int,int> PII;
int n,m;
const int N = 150010,M = N,INF = 0x3f3f3f3f;
int h[N],e[M],ne[M],w[M],idx;
int dist[N];
bool st[N];
void add (int a,int b,int c) {
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
int dijkstra () {
memset (dist,0x3f,sizeof (dist));
dist[1] = 0;
priority_queue <PII,vector <PII>,greater <PII> > heap;
heap.push ({0,1});
while (heap.size ()) {
int t = heap.top ().second;
heap.pop ();
if (st[t]) continue;
st[t] = true;
for (int i = h[t];~i;i = ne[i]) {
int j = e[i];
if (dist[j] > dist[t] + w[i]) {
dist[j] = dist[t] + w[i];
heap.push ({dist[j],j});
}
}
}
return dist[n];
}
int main () {
memset (h,-1,sizeof (h));
cin >> n >>m;
while (m--) {
int a,b,c;
cin >> a >> b >> c;
add (a,b,c);
}
int ans = dijkstra ();
if (ans == INF) puts ("-1");
else cout << ans << endl;
return 0;
}
第一眼还以为你在宣传算法基础课。
$\Large\color{blue}{【算法基础课】\text{Dijkstra}求最短路 \text{II}(\text{Dijkstra})}$
好大的标题
hh
markdown学一下?
哈哈哈哈哈,我会写markdown的。就是感叹一下这标题忒大了,特别醒目
hhhhh
我比较唉摆弄东西hh
很酷的
很酷的
hh
$\Huge \color{blue}{【算法基础课】\text{Dijkstra}求最短路II(\text{Dijkstra})}$
$\Large\color{blue}{【算法基础课】\text{Dijkstra}求最短路 \text{II}(\text{Dijkstra})}$
$\Large\color{blue}{【算法基础课】\text{Dijkstra}求最短路 \text{II}(\text{Dijkstra})}$