Cod sursa(job #2968703)

Utilizator RobertlelRobert Robertlel Data 21 ianuarie 2023 20:19:42
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <climits>
using namespace std;

ifstream f ("maxflow.in");
ofstream g ("maxflow.out");

int n , i , x , y , c , m , graf[1005][1005] , parent [1005] , rezgraf[1005][1005];

bool bfs (int start , int stop)
{
    bool viz[1005];
    memset (viz , 0 , sizeof(viz));
    queue < int > coada;
    coada.push (start);
    viz[start] = true;
    parent[start] = -1;
    while (!coada.empty ())
    {
        int u = coada.front ();
        coada.pop ();
        for (int i = 1 ; i <= n ; i++)
        {
            if (viz[i] == 0 && rezgraf[u][i] > 0)
            {
                if (i == stop)
                   {
                       parent[i] = u;
                      return true;
                   }
                coada.push (i);
                parent[i] = u;
                viz[i] = 1;
            }
        }
    }
    return false;
}

int fordfulkerson (int start , int stop)
{
    int u;
    for (int i = 1 ; i <= n ; i++)
        for (int j = 1 ; j <= n ; j++)
            rezgraf[i][j] = graf[i][j];
    int max_flow = 0;
    while (bfs (start , stop))
    {
        int path_flow = INT_MAX;
        for (int i = stop ; i != start ; i = parent[i])
        {
            u = parent[i];
            path_flow = min(path_flow , rezgraf[u][i]);
        }
        for (int i = stop ; i != start ; i = parent[i])
        {
            u = parent[i];
            rezgraf[u][i] -= path_flow;
            rezgraf[i][u] += path_flow;
        }
        max_flow += path_flow;
    }
    return max_flow;
}
int main()
{
    f >> n >> m;
    for (int i = 1 ; i <= m ; i++)
    {
        f >> x >> y >> c;
        graf[x][y] = c;
    }
    g << fordfulkerson ( 1 , n);
    return 0;
}