Cod sursa(job #3037167)

Utilizator Gruiagruiagruia Gruia Data 25 martie 2023 13:32:24
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
// Ford-Fulkerson algorith in C++

#include <limits.h>
#include <string.h>

#include <iostream>
#include <queue>
using namespace std;

#define V 1001

// Using BFS as a searching algorithm
int graph[V][V];
  int rGraph[V][V];
bool bfs( int s, int t, int (&parent)[V]) {
  bool visited[V];
  memset(visited, 0, sizeof(visited));

  queue<int> q;
  q.push(s);
  visited[s] = true;
  parent[s] = -1;

  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int v = 0; v <=t; v++) {
      if (visited[v] == false && rGraph[u][v] > 0) {
        q.push(v);
        parent[v] = u;
        visited[v] = true;
      }
    }
  }

  return (visited[t] == true);
}

// Applying fordfulkerson algorithm
int fordFulkerson(int s, int t) {
  int u, v;

  for (u = 0; u <=t; u++)
    for (v = 0; v <=t; v++)
      rGraph[u][v] = graph[u][v];
  int parent[V];
  int max_flow = 0;

  // Updating the residual values of edges
  while (bfs( s, t, parent)) {
    int path_flow = INT_MAX;
    for (v = t; v != s; v = parent[v]) {
      u = parent[v];
      path_flow = min(path_flow, rGraph[u][v]);
    }

    for (v = t; v != s; v = parent[v]) {
      u = parent[v];
      rGraph[u][v] -= path_flow;
      rGraph[v][u] += path_flow;
    }

    // Adding the path flows
    max_flow += path_flow;
  }

  return max_flow;
}

int main() {
    int a,b,c,n,m,i;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        graph[a-1][b-1]=c;
    }
    cout << fordFulkerson( 0, n-1) << endl;
}