Advertisement
dan_sml

Sem_2_Task_1

Apr 29th, 2022
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 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) : from(i), to(j), w(w) {};
  22.  
  23.     bool operator==(const Edge& other) const {
  24.         return from == other.from && to == other.to;
  25.     }
  26.  
  27.     size_t from = 0;
  28.     size_t to = 0;
  29.     size_t w = 0;
  30. };
  31.  
  32. std::istream& operator>>(std::istream& input, Edge& p) {
  33.     input >> p.from >> p.to >> p.w;
  34.     --p.from;
  35.     --p.to;
  36.     return input;
  37. }
  38.  
  39. void InputEdges(std::vector<Edge>& edges) {
  40.     for (auto& edge : edges) {
  41.         std::cin >> edge;
  42.     }
  43. }
  44.  
  45. template<>
  46. struct std::hash<Edge> {
  47.     size_t operator()(const Edge& p) const {
  48.         return p.from * p.to;
  49.     }
  50. };
  51.  
  52. std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
  53.     for (auto elem : vec) {
  54.         std::cout << elem + 1 << " ";
  55.     }
  56.     return output;
  57. }
  58.  
  59. struct Graph {
  60.     Graph(size_t n) : size(n), neighbours(n), visited(n, false), color(n, 0),
  61.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
  62.  
  63.     Graph(size_t n, VecNumsVec& matrix) : size(n), visited(n, false), color(n, 0),
  64.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF), neighbours(n) {
  65.         for (size_t v = 0; v < n; ++v) {
  66.             for (size_t u = 0; u < n; ++u) {
  67.                 sum_w += matrix[v][u];
  68.                 if (matrix[v][u] != 0 || v == u) {
  69.                     neighbours[v].push_back(Edge(v, u, matrix[v][u]));
  70.                 }
  71.             }
  72.         }
  73.     };
  74.  
  75.     size_t size = 0;
  76.     bool cycle = false;
  77.  
  78.     std::vector<EdgeVec> neighbours;
  79.     BoolVec visited;
  80.     NumsVec color;
  81.     NumsVec top_sort;
  82.     NumsVec d;
  83.     size_t sum_w = 0;
  84.     size_t top_sort_pos = 0;
  85. };
  86.  
  87. int64_t Dijkstra(Graph& g, size_t s, size_t f) {
  88.     g.d[s] = 0;
  89.     std::set<std::pair<size_t, size_t>> vert;
  90.     vert.insert({g.d[s], s});
  91.     while (!vert.empty()) {
  92.         size_t v = vert.begin()->second;
  93.         vert.erase(vert.begin());
  94.         for (auto edge : g.neighbours[v]) {
  95.             if (g.d[edge.to] > g.d[v] + edge.w) {
  96.                 vert.erase({g.d[edge.to], edge.to});
  97.                 g.d[edge.to] = g.d[v] + edge.w;
  98.                 vert.insert({g.d[edge.to], edge.to});
  99.             }
  100.         }
  101.     }
  102.     if (g.d[f] == INF) {
  103.         return g.sum_w;
  104.     }
  105.     return g.d[f];
  106. }
  107.  
  108. int main() {
  109.     size_t n;
  110.     std::cin >> n;
  111.     VecNumsVec matr(n, NumsVec(n, 0));
  112.     for (size_t i = 0; i < n; ++i) {
  113.         for (size_t j = 0; j < n; ++j) {
  114.             std::cin >> matr[i][j];
  115.         }
  116.     }
  117.     Graph g(n, matr);
  118.     int64_t cheapest_way = Dijkstra(g, 0, 1);
  119.     std::cout << g.sum_w - cheapest_way;
  120. }
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement