C++
$\color{#cc33ff}{— > 算法基础课题解}$
$图解:$
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 1e6 + 10;
typedef pair<int, int> pii;
int n, m;
int h[N], w[N], e[N], ne[N], idx; // 稀疏图,用邻接表来存
int dist[N]; // 存储 当前 1号点到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 spfa() { // 核心算法
memset(dist, 0x3f, sizeof dist); // 初始化所有点的距离
dist[1] = 0; // 把一号点放入队列
queue<int> q; // 定义一个队列来存储所有待更新的点
q.push(1);
st[1] = true;
while (q.size()) { // 队列不空
int t = q.front(); // 取队头
q.pop();
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
if (dist[j] > dist[t] + w[i]) {
dist[j] = dist[t] + w[i];
if (!st[j]) { // 如果j不在队列中,才会把它加入队列中去
q.push(j);
st[j] = true;
}
}
}
}
// if (dist[n] == 0x3f3f3f3f) return -1;
// else return dist[n];
return dist[n]; // 数据加强了,会有一种最短路是 -1 的情况
}
int main() {
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h); // 初始化
while (m --) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
}
int t = spfa();
if (t == 0x3f3f3f3f) cout << "impossible";
else printf("%d", t);
return 0;
}