1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<vector> using namespace std;
const int N = 1e6 + 10; typedef pair<int, int> PII;
int h[N], e[N], ne[N], w[N], idx; int dist[N]; bool st[N]; int n, m;
void add(int a, int b, int c){ e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; }
void dijkstra(){ priority_queue<PII, vector<PII>, greater<PII>> q; memset(dist, 0x3f, sizeof dist); dist[1] = 0; q.push({0, 1});
while(!q.empty()){ auto t = q.top(); int distance = t.first, ver = t.second; q.pop();
if(st[ver]) continue; st[ver] = true;
for(int i = h[ver]; i != -1; i = ne[i]){ int j = e[i]; if(dist[j] > dist[ver] + w[i]){ dist[j] = dist[ver] + w[i]; q.push({dist[j], j}); } } }
}
int main(){ memset(h, -1, sizeof h); scanf("%d%d", &n, &m); while(m--){ int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); }
dijkstra();
if(dist[n] == 0x3f3f3f3f) puts("-1"); else printf("%d\n", dist[n]);
return 0;
}
|