Advertisement
dan_sml

Sem_2_Task_7

May 2nd, 2022
1,070
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <unordered_map>
  5. #include <queue>
  6.  
  7. struct Edge;
  8.  
  9. const int64_t INF = int64_t(1e15);
  10.  
  11. namespace {
  12.     using NumsVec = std::vector<int64_t>;
  13.     using VecNumsVec = std::vector<NumsVec>;
  14.     using BoolVec = std::vector<bool>;
  15.     using EdgeVec = std::vector<Edge>;
  16.     using VecEdgeVec = std::vector<EdgeVec>;
  17.     using UnMapNumEdge = std::unordered_map<int64_t, Edge>;
  18. }
  19.  
  20. struct Edge {
  21.     Edge() = default;
  22.     Edge(std::pair<size_t, size_t> edge) : from(edge.first), to(edge.second) {};
  23.     Edge(size_t i, size_t j, size_t w) : from(i), to(j), c(w) {};
  24.  
  25.     bool operator==(const Edge& other) const {
  26.         return from == other.from && to == other.to;
  27.     }
  28.  
  29.     Edge Reverse() {
  30.         return Edge(to, from, c);
  31.     }
  32.  
  33.     size_t from = 0;
  34.     size_t to = 0;
  35.     int64_t c = 0;
  36. };
  37.  
  38. std::istream& operator>>(std::istream& input, Edge& edge) {
  39.     input >> edge.from >> edge.to >> edge.c;
  40.     --edge.from;
  41.     --edge.to;
  42.     return input;
  43. }
  44.  
  45. void InputEdges(std::vector<Edge>& edges) {
  46.     for (auto& edge : edges) {
  47.         std::cin >> edge;
  48.     }
  49. }
  50.  
  51. template<>
  52. struct std::hash<Edge> {
  53.     size_t operator()(const Edge& p) const {
  54.         return p.from * p.to;
  55.     }
  56. };
  57.  
  58. std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
  59.     for (auto elem : vec) {
  60.         std::cout << elem + 1 << " ";
  61.     }
  62.     return output;
  63. }
  64.  
  65. struct Graph {
  66.     Graph(size_t n) : size(n), neighbours(n), visited(n, false), color(n, 0),
  67.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
  68.  
  69.     Graph(size_t n, EdgeVec& edges) : size(n), d(n, INF), flow(n, NumsVec(n, 0)), neighbours(n) {
  70.         for (auto edge : edges) {
  71.             auto& edge_direct = neighbours[edge.from][edge.to];
  72.             edge_direct.from = edge.from;
  73.             edge_direct.to = edge.to;
  74.             edge_direct.c += edge.c;
  75.             auto& edge_back = neighbours[edge.to][edge.from];
  76.             edge_back.to = edge.from;
  77.             edge_back.from = edge.to;
  78.         }
  79.     };
  80.  
  81.     size_t size = 0;
  82.     bool cycle = false;
  83.  
  84.     std::vector<UnMapNumEdge> neighbours;
  85.     VecNumsVec matrix;
  86.     VecNumsVec flow;
  87.     BoolVec visited;
  88.     NumsVec color;
  89.     NumsVec top_sort;
  90.     NumsVec d;
  91.     EdgeVec route;
  92.     size_t max_flow = 0;
  93.     size_t sum_w = 0;
  94.     size_t top_sort_pos = 0;
  95. };
  96.  
  97. bool Bfs(Graph& g, size_t s, size_t f) {
  98.     NumsVec dist(g.size, INF);
  99.     NumsVec parent(g.size, s);
  100.     dist[s] = 0;
  101.     std::queue<size_t> q;
  102.     q.push(s);
  103.     while (!q.empty()) {
  104.         size_t cur = q.front();
  105.         q.pop();
  106.         for (auto [v, edge] : g.neighbours[cur]) {
  107.             if (edge.c - g.flow[cur][v] > 0 && dist[v] > dist[cur] + 1) {
  108.                 dist[v] = dist[cur] + 1;
  109.                 parent[v] = cur;
  110.                 q.push(v);
  111.             }
  112.         }
  113.     }
  114.     if (dist[f] == INF) {
  115.         return false;
  116.     }
  117.     EdgeVec way;
  118.     size_t cur = f;
  119.     while (cur != s) {
  120.         way.push_back(g.neighbours[parent[cur]][cur]);
  121.         cur = parent[cur];
  122.     }
  123.     std::reverse(way.begin(), way.end());
  124.     g.route = way;
  125.     return true;
  126. }
  127.  
  128. void EdmondsKarp(Graph& g, size_t s, size_t t) {
  129.     while (Bfs(g, s, t)) {
  130.         int64_t cf = INF;
  131.         for (auto edge : g.route) {
  132.             cf = std::min(cf, edge.c - g.flow[edge.from][edge.to]);
  133.         }
  134.         for (auto edge : g.route) {
  135.             g.flow[edge.from][edge.to] += cf;
  136.             g.flow[edge.to][edge.from] = -g.flow[edge.from][edge.to];
  137.         }
  138.         g.max_flow += cf;
  139.     }
  140. }
  141.  
  142. int main() {
  143.     size_t n, m;
  144.     std::cin >> n >> m;
  145.     EdgeVec edges(m);
  146.     InputEdges(edges);
  147.     Graph g(n, edges);
  148.     EdmondsKarp(g, 0, n - 1);
  149.     std::cout << g.max_flow;
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement