spfa
作者:
ysc
,
2021-07-29 12:30:11
,
所有人可见
,
阅读 313
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5+10;
int n, m;
int h[N], e[N], ne[N], w[N], idx; //定义邻接表存储,w[N]为权重
int dist[N]; //定义距离数组
bool st[N]; //判断当前点是否在队列
void add(int a, int b, int c) //背一遍
{
w[idx] = c, e[idx] = b, 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] ) //判断刚刚更新的点是否在队列中
{
q.push(j); //不在队列,入队
st[j] = true; //标记刚刚入队的点的状态
}
}
}
}
if ( dist[n] == 0x3f3f3f3f ) return -1;
return dist[n];
}
int main()
{
memset(h, -1, sizeof h); //初始化、初始化、初始化
cin >> n >> m;
while ( m -- ) //输入m条边
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
int t = spfa();
if ( t == -1 ) puts("impossible");
else cout << t << endl;
return 0;
}