Advertisement
coloriot

HA31_Paths(9)

Nov 15th, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 1000000000;
  8.  
  9. class Edge {
  10. public:
  11.     int to;
  12.     int weight;
  13.     Edge(int t, int w) {
  14.         to = t;
  15.         weight = w;
  16.     }
  17. };
  18.  
  19. class Graph {
  20. private:
  21.     int N;
  22.     vector<vector<Edge> > adj;
  23.     vector<int> dist;
  24.     vector<bool> used;
  25.  
  26. public:
  27.     Graph(int n) {
  28.         N = n;
  29.         adj.resize(N);
  30.         dist.resize(N, INF);
  31.         used.resize(N, false);
  32.     }
  33.  
  34.     void add_edge(int from, int to, int weight) {
  35.         adj[from].push_back(Edge(to, weight));
  36.     }
  37.  
  38.     int dijkstra(int start_v, int end_v) {
  39.         dist[start_v] = 0;
  40.         priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
  41.         pq.push(make_pair(0, start_v));
  42.  
  43.         while (!pq.empty()) {
  44.             pair<int, int> p = pq.top();
  45.             pq.pop();
  46.             int v = p.second;
  47.             int d = p.first;
  48.  
  49.             if (used[v]) {
  50.                 continue;
  51.             }
  52.             used[v] = true;
  53.  
  54.             if (v == end_v) {
  55.                 return dist[end_v];
  56.             }
  57.  
  58.             for (size_t i = 0; i < adj[v].size(); ++i) {
  59.                 int to = adj[v][i].to;
  60.                 int weight = adj[v][i].weight;
  61.  
  62.                 if (dist[v] + weight < dist[to]) {
  63.                     dist[to] = dist[v] + weight;
  64.                     pq.push(make_pair(dist[to], to));
  65.                 }
  66.             }
  67.         }
  68.  
  69.         if (dist[end_v] == INF) {
  70.             return -1;
  71.         } else {
  72.             return dist[end_v];
  73.         }
  74.     }
  75. };
  76.  
  77. int main() {
  78.     int N, M;
  79.     cin >> N >> M;
  80.  
  81.     int S, F;
  82.     cin >> S >> F;
  83.     S--;
  84.     F--;
  85.  
  86.     Graph graph(N);
  87.  
  88.     for (int i = 0; i < M; ++i) {
  89.         int A, B, T;
  90.         cin >> A >> B >> T;
  91.         A--;
  92.         B--;
  93.         graph.add_edge(A, B, T);
  94.     }
  95.  
  96.     int result = graph.dijkstra(S, F);
  97.     cout << result << endl;
  98.  
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement