main.cc 972 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <vector>
  5. using namespace std;
  6. const int N = 30000;
  7. const int M = 150000;
  8. const int INF = 0x3F3F3F3F;
  9. int dist[N + 1];
  10. struct E {
  11. int v;
  12. int c;
  13. E(int v, int c) : v(v), c(c) {}
  14. bool operator<(const E &that) const { return this->c > that.c; }
  15. };
  16. int main() {
  17. int n, m, a, b, c, t;
  18. scanf("%d %d", &n, &m);
  19. memset(dist, 0x3F, sizeof(dist));
  20. vector<vector<E>> adj(n + 1);
  21. for (int i = 0; i < m; i++) {
  22. scanf("%d %d %d", &a, &b, &c);
  23. adj[a].push_back(E(b, c));
  24. }
  25. priority_queue<E> pq;
  26. dist[1] = 0, t = 1;
  27. for (int i = 0; i < adj[1].size(); i++) pq.push(adj[1][i]);
  28. while (t < n) {
  29. E e = pq.top();
  30. pq.pop();
  31. if (dist[e.v] <= e.c) continue;
  32. dist[e.v] = e.c;
  33. vector<E>::iterator it;
  34. for (it = adj[e.v].begin(); it != adj[e.v].end(); ++it)
  35. if (dist[it->v] == INF) pq.push(E(it->v, e.c + it->c));
  36. t++;
  37. }
  38. printf("%d\n", dist[n]);
  39. return 0;
  40. }