AcWing 850. Dijkstra求最短路 II
阿新 • • 發佈:2020-08-02
AcWing 850. Dijkstra求最短路 II
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; typedef pair<int,int> PII; int n,m; int h[N],e[N],ne[N],w[N],idx; int dist[N]; bool st[N]; void add(int a,int b,int c){ e[idx]=b; ne[idx]=h[a]; w[idx]=c; h[a]=idx++; } int dijkstra(){ memset(dist,0x3f,sizeof dist); dist[1]=0; priority_queue<PII,vector<PII>,greater<PII>> heap; //前面是dist,後面是座標 heap.push({0,1}); while(heap.size()){ PII t=heap.top(); heap.pop(); //distance即為起始點->a的距離 int ver=t.second,distance=t.first; if(st[ver]) continue; st[ver]=true; for(int i=h[ver];i!=-1;i=ne[i]){ //這個j就是add中的b,dist[j]就是起始點->b的距離 int j=e[i]; //w[i]即為a->b點的距離 //distance+w[i]=起始點->a+a->b if(dist[j]>distance+w[i]){ //更新 dist[j]=distance+w[i]; heap.push({dist[j],j}); } } } if(dist[n]==0x3f3f3f3f) return -1; return dist[n]; } int main(){ scanf("%d%d",&n,&m); memset(h,-1,sizeof h); while(m--){ int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } printf("%d",dijkstra()); return 0; }