Advertisement
myloyo

11. Максимальный поток V (Форд-Фалкерсон)

Dec 9th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. bool DFS(string u, string t, map<string, bool>& visited, map<string, string>& parent, map<string, map<string, int>>& graf_res) {
  2.         visited[u] = true;
  3.         if (u == t) return true;
  4.  
  5.         for (const auto& neighbor : graf_res[u]) {
  6.             string v = neighbor.first;
  7.             int capacity = neighbor.second;
  8.  
  9.             if (!visited[v] && capacity > 0) {
  10.                 parent[v] = u;
  11.                 if (DFS(v, t, visited, parent, graf_res)) {
  12.                     return true;
  13.                 }
  14.             }
  15.         }
  16.         return false;
  17.     }
  18.  
  19.     void FordFulkerson(string s, string t) {
  20.         if (!ExistVertex(s) || !ExistVertex(t)) {
  21.             cout << "Исток или сток не существует" << endl;
  22.             return;
  23.         }
  24.  
  25.         map<string, map<string, int>> graf_res = AdjList;
  26.         map<string, string> parent;
  27.         int maxFlow = 0;
  28.  
  29.         while (true) {
  30.             map<string, bool> visited;
  31.             parent.clear();
  32.  
  33.             // Поиск увеличивающего пути
  34.             if (!DFS(s, t, visited, parent, graf_res)) break;
  35.  
  36.             // Определяем минимальный поток в найденном пути
  37.             int pathFlow = INF;
  38.             for (string v = t; v != s; v = parent[v]) {
  39.                 string u = parent[v];
  40.                 pathFlow = min(pathFlow, graf_res[u][v]);
  41.             }
  42.  
  43.             // Обновляем резервный граф
  44.             for (string v = t; v != s; v = parent[v]) {
  45.                 string u = parent[v];
  46.                 graf_res[u][v] -= pathFlow;
  47.                 graf_res[v][u] += pathFlow;
  48.             }
  49.  
  50.             maxFlow += pathFlow;
  51.         }
  52.  
  53.         cout << "Максимальный поток из " << s << " в " << t << ": " << maxFlow << endl;
  54.     }
  55.  
  56.  
  57. //main.cpp
  58.  
  59. #include <iostream>
  60. #include <string>
  61. #include <vector>
  62. #include <fstream>
  63. #include <vector>
  64. #include <list>
  65. #include <map>
  66. #include <locale>
  67. #include <windows.h>
  68. #include "Graph.h"
  69.  
  70. using namespace std;
  71.  
  72. int main() {
  73.     setlocale(LC_ALL, "Russian");
  74.     SetConsoleOutputCP(CP_UTF8);
  75.  
  76.     cout << "Задание 11\n";
  77.     Graph g1;
  78.     g1.loadFromFile("potok.txt");
  79.  
  80.     string s, t;
  81.     cout << "введите исток и сток: "; cin >> s >> t;
  82.     g1.FordFulkerson(s, t);
  83.  
  84. }
  85.  
  86. //potok.txt
  87. directed
  88. weighted
  89. s a 10
  90. s b 10
  91. b a 2
  92. a c 4
  93. a t 8
  94. b t 9
  95. c t 10
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement