1. 程式人生 > 實用技巧 >AcWing 850. Dijkstra求最短路 II

AcWing 850. Dijkstra求最短路 II

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;
}