Advertisement
dan_sml

Sem_2_Task_4

Apr 29th, 2022
1,122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5.  
  6. struct Edge;
  7.  
  8. const int64_t INF = int64_t(1e15);
  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.     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) : from(i), to(j) {};
  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);
  29.     }
  30.  
  31.     size_t from = 0;
  32.     size_t to = 0;
  33. };
  34.  
  35. std::istream& operator>>(std::istream& input, Edge& edge) {
  36.     input >> edge.from >> edge.to;
  37.     --edge.from;
  38.     --edge.to;
  39.     return input;
  40. }
  41.  
  42. void InputEdges(std::vector<Edge>& edges) {
  43.     for (auto& edge : edges) {
  44.         std::cin >> edge;
  45.     }
  46. }
  47.  
  48. template<>
  49. struct std::hash<Edge> {
  50.     size_t operator()(const Edge& p) const {
  51.         return p.from * p.to;
  52.     }
  53. };
  54.  
  55. std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
  56.     for (auto elem : vec) {
  57.         std::cout << elem + 1 << " ";
  58.     }
  59.     return output;
  60. }
  61.  
  62. struct Graph {
  63.     Graph(size_t n) : size(n), neighbours(n), visited(n, false), color(n, 0),
  64.     top_sort(n, 0), top_sort_pos(n - 1), d(n, NumsVec(n, INF)) {};
  65.  
  66.     Graph(size_t n, EdgeVec& edges) : size(n), visited(n, false), color(n, 0),
  67.     top_sort(n, 0), top_sort_pos(n - 1), d(n, NumsVec(n, INF)), matrix(n, NumsVec(n, 1)), neighbours(n) {
  68.         for (auto edge : edges) {
  69.             neighbours[edge.from].push_back(edge);
  70.         }
  71.         for (size_t v = 0; v < n; ++v) {
  72.             d[v][v] = 0;
  73.         }
  74.     };
  75.  
  76.     size_t size = 0;
  77.     bool cycle = false;
  78.  
  79.     VecEdgeVec neighbours;
  80.     VecNumsVec matrix;
  81.     BoolVec visited;
  82.     NumsVec color;
  83.     NumsVec top_sort;
  84.     VecNumsVec d;
  85.     size_t sum_w = 0;
  86.     size_t top_sort_pos = 0;
  87. };
  88.  
  89. void TopSort(Graph& g, size_t v) {
  90.     g.visited[v] = true;
  91.     for (auto [from, to] : g.neighbours[v]) {
  92.         if (!g.visited[to]) {
  93.             TopSort(g, to);
  94.         }
  95.     }
  96.     g.top_sort[g.top_sort_pos] = v;
  97.     --g.top_sort_pos;
  98. }
  99.  
  100. void CountDistances(Graph& g) {
  101.     for (size_t v : g.top_sort) {
  102.         for (auto [from, to] : g.neighbours[v]) {
  103.             for (size_t u = 0; u < g.size; ++u) {
  104.                 g.d[u][to] = std::min(g.d[u][to], g.d[u][v] + 1);
  105.             }
  106.         }
  107.     }
  108. }
  109.  
  110. int main() {
  111.     size_t n, m;
  112.     std::cin >> n >> m;
  113.     EdgeVec edges(m);
  114.     InputEdges(edges);
  115.     Graph g(n, edges);
  116.     for(size_t v = 0; v < g.size; ++v) {
  117.         if (!g.visited[v]) {
  118.             TopSort(g, v);
  119.         }
  120.     }
  121.     CountDistances(g);
  122.     for (size_t u = 0; u < n; ++u) {
  123.         for (size_t v = 0; v < n; ++v) {
  124.             std::cout << (g.d[u][v] == INF ? -1 : g.d[u][v]) << " ";
  125.         }
  126.         std::cout << std::endl;
  127.     }
  128. }
  129.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement