AcWing 851. spfa求最短路
原题链接
简单
作者:
minux
,
2020-04-27 14:37:54
,
所有人可见
,
阅读 522
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII; // 距离-节点编号
#define fi first
#define se second
#define INF 0x3f3f3f3f
const int N=1e5+5;
vector<PII> G[N];
int DIS[N];
bool vis[N];
int n,m;
int SPFA(){
queue<int> q;
DIS[1]=0;
q.push(1);
vis[1]=true; // 当前节点已经加入到队列中
while(!q.empty()){
int node=q.front();
q.pop();
vis[node]=false;
for(auto &v: G[node]){
if(DIS[v.fi]>DIS[node]+v.se){
DIS[v.fi]=DIS[node]+v.se;
if(!vis[v.fi]){q.push(v.fi); vis[v.fi]=true;}
}
}
}
if(DIS[n]==INF) return -1;
return DIS[n];
}
int main(){
// SPFA(使用Dijkstra算法模板改进)
memset(vis, 0x00, sizeof vis);
memset(DIS, 0x3f, sizeof DIS);
cin>>n>>m;
int x, y, w;
while(m--){
cin>>x>>y>>w;
G[x].push_back({y, w});
}
int res=SPFA();
if(res==-1) cout<<"impossible"<<endl;
else cout<<res<<endl;
return 0;
}