Cod sursa(job #2306604)

Utilizator DariusDCDarius Capolna DariusDC Data 22 decembrie 2018 17:07:51
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 1001
#define infinit (1 << 30)

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m;
int residualCapacity[nmax][nmax];

bool bfs(int capacity[nmax][nmax],int parent[],int source,int sink)
{
    bool vizitat[nmax];
    for (int i = 1; i <= n; i++)
        vizitat[i] = false;
    queue < int > coada;
    coada.push(source);
    vizitat[source] = true;
    bool GasitDrum = false;
    while (!coada.empty())
    {
        int u = coada.front();
        coada.pop();
        for (int v = 1; v <= n; v++)
        {
            if (!vizitat[v] && capacity[u][v] > 0)
            {
                parent[v] = u;
                vizitat[v] = true;
                coada.push(v);
                if (v == sink)
                    GasitDrum = true;
            }
        }
    }
    return GasitDrum;
}

int MaximumFlow(int capacity[nmax][nmax],int source,int sink)
{
    int parent[nmax];
    int maxflow = 0;
    while (bfs(capacity,parent,source,sink) == true)
    {
        int flow = infinit;
        int v = sink;
        while (v != source)
        {
            int u = parent[v];
            if (capacity[u][v] < flow)
                flow = capacity[u][v];
            v = u;
        }
        maxflow += flow;

        v = sink;
        while (v != source)
        {
            int u = parent[v];
            capacity[u][v] -= flow;
            capacity[v][u] += flow;
            v = u;
        }
    }
    return maxflow;

}

int main()
{
    fin >> n >> m;
    for (int i = 1 ;i <= m; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        residualCapacity[x][y] = c;
    }
    fout << MaximumFlow(residualCapacity,1,n);
    return 0;
}