算法竞赛进阶指南 849. Dijkstra求最短路 II(堆优化算法,邻接表)

#include<bits/stdc++.h>
using namespace std;
const int N = 150010;
int h[N], ver[N], edge[N], ne[N], cnt;
int d[N], n, m;
bool v[N];

priority_queue<pair<int, int>> q;

int add(int x, int y, int z){ //使用邻接表的方式存图
    ver[cnt] = y;
    edge[cnt] = z;
    ne[cnt] = h[x];
    h[x] = cnt ++;
}

int main(){
    cnt ++;
    cin >> n >> m;
    for(int i = 1; i <= m; i ++){
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        add(x, y, z);
    }
    memset(d, 0x7f, sizeof d); //由于m,n都是150000级别的,边长不超过10000,所以d最大为15*10e8的级别
    d[1] = 0;           //而0x7f7f7f7f是21.39*10e8的级别
    q.push(make_pair(0, 1));  //为什么平时使用0x3f3f3f3f来表示最大值,因为其是10*10e8的级别,即使有一次加法也不会溢出
    while(!q.empty()){
        int x = q.top().second;
        q.pop();
        if(v[x]) continue;    //懒惰删除
        v[x] = true;
        for(int i = h[x]; i ; i = ne[i]){
            int y = ver[i], z = edge[i];
            if(d[y] > d[x] + z){
                d[y] = d[x] + z;
                q.push(make_pair(-d[y], y));
            }
        }
    }
    if(d[n] == 0x7f7f7f7f) puts("-1");
    else cout << d[n] << endl;
    
    return 0;
}

  

posted @ 2022-05-26 08:46  bz-2021  阅读(16)  评论(0)    收藏  举报