Advertisement
Hamikadze

Untitled

May 7th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. // Course_work.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include <iostream>
  5. #include <queue>
  6.  
  7. using namespace std;
  8. bool bfs(vector<vector<int> >& rGraph, int s, int t, int parent[], int V)
  9. {
  10.     auto visited = new bool[V];
  11.     memset(visited, false, sizeof(visited));
  12.     queue<int> q;
  13.     q.push(s);
  14.     visited[s] = true;
  15.     parent[s] = -1;
  16.     while (!q.empty())
  17.     {
  18.         int u = q.front();
  19.         q.pop();
  20.  
  21.         for (int v = 0; v < V; v++)
  22.         {
  23.             if (visited[v] == false && rGraph[u][v] > 0)
  24.             {
  25.                 q.push(v);
  26.                 parent[v] = u;
  27.                 visited[v] = true;
  28.             }
  29.         }
  30.     }
  31.  
  32.     return (visited[t] == true);
  33. }
  34.  
  35. int fordFulkerson(vector<vector<int> > & graph, int s, int t, int V)
  36. {
  37.     int u, v;
  38.     vector< vector<int> >rGraph;
  39.     for (int i = 0; i < V; i++)
  40.     {
  41.         vector<int>vec;
  42.         for (int j = 0; j < V; j++)
  43.         {
  44.             vec.push_back(0);
  45.         }
  46.         rGraph.push_back(vec);
  47.         vec.clear();
  48.     }
  49.     for (u = 0; u < V; u++)
  50.         for (v = 0; v < V; v++)
  51.             rGraph[u][v] = graph[u][v];
  52.  
  53.     auto parent = new int[V];
  54.  
  55.     int max_flow = 0;
  56.  
  57.     while (bfs(rGraph, s, t, parent, V))
  58.     {
  59.         int path_flow = INT_MAX;
  60.         vector<int>vec;
  61.         for (v = t; v != s; v = parent[v])
  62.         {
  63.             u = parent[v];
  64.             path_flow = min(path_flow, rGraph[u][v]);
  65.             vec.push_back(v);
  66.         }
  67.         vec.push_back(s);
  68.         for (int k = vec.size() - 1; k >= 0; k--)
  69.             cout << vec[k] + 1 << "->";
  70.         vec.clear();
  71.         cout << " : " << path_flow << endl;
  72.         for (v = t; v != s; v = parent[v])
  73.         {
  74.             u = parent[v];
  75.             rGraph[u][v] -= path_flow;
  76.             rGraph[v][u] += path_flow;
  77.         }
  78.         max_flow += path_flow;
  79.     }
  80.  
  81.     return max_flow;
  82. }
  83.  
  84. int main()
  85. {
  86.     vector< vector<int> >graph;
  87.     int N, E;
  88. //N - количество нодов, E - Колличество вершин
  89.     cin >> N >> E;
  90.     vector<int>vec;
  91. //Построение матрицы смежности
  92.     for (int i = 0; i < N; i++)
  93.     {
  94.         for (int j = 0; j < N; j++)
  95.         {
  96.             vec.push_back(0);
  97.         }
  98.         graph.push_back(vec);
  99.         vec.clear();
  100.     }
  101. //x - первая вершина (из) y - вторая вершина (куда) w - вес (пропуская способность)
  102.     for (int i = 0; i < E; i++)
  103.     {
  104.         int x, y, w;
  105.         cin >> x >> y >> w;
  106.         graph[x - 1][y - 1] = w;
  107.     }
  108.     int src, dest;
  109. //Откуда и до кода просчитать пропускную способность
  110.     cin >> src >> dest;
  111.     cout << fordFulkerson(graph, src - 1, dest - 1, N) << endl;
  112.  
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement