【堆優化Dijkstra】AcWing850.Dijkstra求最短路 II
阿新 • • 發佈:2022-05-25
AcWing850.Dijkstra求最短路 II
題解
#include <iostream> #include <cstring> #include <queue> #include <vector> using namespace std; const int N = 1e6 + 10; typedef pair<int,int> PII; bool flag[N]; int d[N]; int h[N], e[N], ne[N], v[N], idx; void add(int x, int y, int z) { ne[idx] = h[x], h[x] = idx, e[idx] = y, v[idx++] = z; } void Dijkstra() { memset(d, 0x3f, sizeof d); d[1] = 0; priority_queue<PII, vector<PII>, greater<PII>> q; q.push({d[1], 1}); while(q.size()) { int head = q.top().second, distance = q.top().first; q.pop(); if(flag[head]) continue; flag[head] = true; for(int i = h[head]; ~i; i = ne[i]) if(!flag[e[i]] && distance + v[i] < d[e[i]]) d[e[i]] = v[i] + distance, q.push({d[e[i]], e[i]}); } } int main() { memset(h, -1, sizeof h); int n, m, x, y, z; scanf("%d%d",&n,&m); for(int i = 1; i <= m; ++i) scanf("%d%d%d",&x,&y,&z), add(x, y, z); Dijkstra(); if(flag[n]) cout << d[n] << endl; else cout << -1 << endl; return 0; }