AcWing 851. spfa求最短路
原题链接
简单
作者:
Jonny_6
,
2025-01-09 15:32:50
,
所有人可见
,
阅读 1
//https://www.acwing.com/problem/content/853/
// Created by guany on 25-1-9.
#include <bits/stdc++.h>
#include <queue>
using namespace std;
const int N=1e5+10;
//使用邻接表存图
int h[N],ne[N],e[N],w[N],idx;
//spfa“松弛”算法借助队列来实现
queue<int> q;
int st[N];//st记录节点是否还在队列中
int dist[N];//存储节点n到源节点的最短距离
void add(int x,int y,int z)
{
w[idx]=z;
ne[idx]=h[x];
e[idx]=y;
h[x]=idx++;
}
void spfa()
{
st[1]=1;
q.push(1);
//源节点到自身的距离为0
dist[1]=0;
while(!q.empty()){
int u=q.front();
q.pop();
st[u]=0;
for(int i=h[u];~i;i=ne[i]){
if(dist[e[i]]>dist[u]+w[i]){
if(!st[e[i]]){
st[e[i]]=1;
q.push(e[i]);
}
dist[e[i]]=dist[u]+w[i];
}
}
}
}
int main()
{
memset(dist,0x3f,sizeof(dist));
memset(h,-1,sizeof(h));
int n,m;
cin>>n>>m;
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
spfa();
if(dist[n]==0x3f3f3f3f) cout<<"impossible"<<endl;
else cout<<dist[n]<<endl;
return 0;
}