Advertisement
dan_sml

Sem_2_Task_5

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