#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int n, m;
vector<pair<int, int>> g[N]; // 存储图的邻接表表示
int dist[N]; // 存储从1号点到其他点的最短距离
bool st[N]; // 标记某个点是否在队列中
int spfa() // SPFA算法求解最短路径
{
memset(dist, 0x3f, sizeof dist); // 初始化距离数组为无穷大
dist[1] = 0; // 起点到自己的距离为0
queue<int> q; // 用于存储待处理的点
q.push(1); // 将起点加入队列
st[1] = true; // 标记起点在队列中
while (q.size()) // 当队列不为空时循环
{
int t = q.front(); // 取出队首元素
q.pop(); // 弹出队首元素
st[t] = false; // 标记该点不在队列中
for (auto e : g[t]) // 遍历该点的邻接点
{
int j = e.first; // 邻接点的编号
if (dist[j] > dist[t] + e.second) // 如果通过当前点到达邻接点的距离更短
{
dist[j] = dist[t] + e.second; // 更新距离
if (!st[j]) // 如果邻接点不在队列中
{
q.push(j); // 将邻接点加入队列
st[j] = true; // 标记邻接点在队列中
}
}
}
}
return dist[n]; // 返回从1号点到n号点的最短距离
}
int main()
{
scanf("%d%d", &n, &m); // 输入顶点数和边数
while (m -- ) // 输入边的信息
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a].push_back({b, c}); // 将边的信息存入邻接表
}
int t = spfa(); // 调用SPFA算法求解最短路径
if (t == 0x3f3f3f3f) puts("impossible"); // 如果无法到达,输出impossible
else printf("%d\n", t); // 输出最短距离
return 0;
}
AcWing 851. spfa求最短路
最新推荐文章于 2024-08-31 15:48:32 发布