因为要快速找到从每个点出发的所有邻边,所以用邻接表存储
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int N=1e5+10,INF=0x3f3f3f3f;
int h[N],e[N],ne[N],idx,w[N];
int n,m;
int d[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 dijkstra(){
memset(d,INF,sizeof(d));
d[1]=0;
priority_queue<P,vector<P>,greater<P>> heap;
heap.push({0,1}); //第一维是距离,第二维是节点编号
while(!heap.empty()){
P t=heap.top();
heap.pop();
int ver=t.second,distance=t.first;
if(st[ver]) continue; //防止重复遍历很多点,时间复杂度保证是 mlogn
st[ver]=true;
for(int i=h[ver];i!=-1;i=ne[i]){
int j=e[i];
if(distance+w[i]<d[j]){
d[j]=distance+w[i];
heap.push({d[j],j});
}
}
}
if(d[n]==INF) return -1;
else return d[n];
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof(h));
while(m--){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
cout<<dijkstra()<<endl;
}