dan_sml

Sem_2_Task_3

Apr 29th, 2022
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5.  
  6. struct Edge;
  7.  
  8. const size_t INF = size_t(1e12);
  9.  
  10. namespace {
  11.     using NumsVec = std::vector<size_t>;
  12.     using VecNumsVec = std::vector<NumsVec>;
  13.     using BoolVec = std::vector<bool>;
  14.     using EdgeVec = std::vector<Edge>;
  15.     using VecEdgeVec = std::vector<EdgeVec>;
  16. }
  17.  
  18. struct Edge {
  19.     Edge() = default;
  20.     Edge(std::pair<size_t, size_t> edge) : from(edge.first), to(edge.second) {};
  21.     Edge(size_t i, size_t j, size_t w, size_t d) : from(i), to(j), w(w), destruction(d) {};
  22.  
  23.     bool operator==(const Edge& other) const {
  24.         return from == other.from && to == other.to;
  25.     }
  26.  
  27.     Edge Reverse() {
  28.         return Edge(to, from, w, destruction);
  29.     }
  30.  
  31.     size_t from = 0;
  32.     size_t to = 0;
  33.     size_t w = 0;
  34.     size_t destruction = 0;
  35. };
  36.  
  37. std::istream& operator>>(std::istream& input, Edge& p) {
  38.     input >> p.from >> p.to >> p.w >> p.destruction;
  39.     --p.from;
  40.     --p.to;
  41.     return input;
  42. }
  43.  
  44. void InputEdges(std::vector<Edge>& edges) {
  45.     for (auto& edge : edges) {
  46.         std::cin >> edge;
  47.     }
  48. }
  49.  
  50. template<>
  51. struct std::hash<Edge> {
  52.     size_t operator()(const Edge& p) const {
  53.         return p.from * p.to;
  54.     }
  55. };
  56.  
  57. std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
  58.     for (auto elem : vec) {
  59.         std::cout << elem + 1 << " ";
  60.     }
  61.     return output;
  62. }
  63.  
  64. struct Graph {
  65.     Graph(size_t n) : size(n), neighbours(n), visited(n, false), color(n, 0),
  66.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
  67.  
  68.     Graph(size_t n, EdgeVec& edges) : size(n), visited(n, false), color(n, 0),
  69.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF), matrix(n, NumsVec(n, 1)), neighbours(n) {
  70.         for (auto edge : edges) {
  71.             neighbours[edge.from].push_back(edge);
  72.             neighbours[edge.to].push_back(edge.Reverse());
  73.         }
  74.         for (size_t v = 0; v < n; ++v) {
  75.             matrix[v][v] = 0;
  76.         }
  77.     };
  78.  
  79.     size_t size = 0;
  80.     bool cycle = false;
  81.  
  82.     VecEdgeVec neighbours;
  83.     VecNumsVec matrix;
  84.     BoolVec visited;
  85.     NumsVec color;
  86.     NumsVec top_sort;
  87.     NumsVec d;
  88.     size_t sum_w = 0;
  89.     size_t top_sort_pos = 0;
  90. };
  91.  
  92. int64_t Dijkstra(Graph& g, size_t s, size_t f) {
  93.     g.d[s] = 0;
  94.     std::set<std::pair<size_t, size_t>> vert;
  95.     vert.insert({g.d[s], s});
  96.     while (!vert.empty()) {
  97.         size_t v = vert.begin()->second;
  98.         vert.erase(vert.begin());
  99.         for (auto edge : g.neighbours[v]) {
  100.             if (g.d[edge.from] <= edge.destruction && g.d[edge.to] > g.d[v] + edge.w) {
  101.                 vert.erase({g.d[edge.to], edge.to});
  102.                 g.d[edge.to] = g.d[v] + edge.w;
  103.                 vert.insert({g.d[edge.to], edge.to});
  104.             }
  105.         }
  106.     }
  107.     if (g.d[f] == INF) {
  108.         return -1;
  109.     }
  110.     return g.d[f];
  111. }
  112.  
  113. int main() {
  114.     size_t n, m, s, t;
  115.     std::cin >> n >> m >> s >> t;
  116.     --s;
  117.     --t;
  118.     EdgeVec edges(m);
  119.     InputEdges(edges);
  120.     Graph g(n, edges);
  121.     int64_t answer = Dijkstra(g, s, t);
  122.     if (answer == -1) {
  123.         std::cout << "Oh, no, Indiana Jones fucked up :(";
  124.     } else {
  125.         std::cout << answer;
  126.     }
  127. }
  128.  
Add Comment
Please, Sign In to add comment