Cod sursa(job #1981283)

Utilizator saba_alexSabadus Alex saba_alex Data 15 mai 2017 12:35:40
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
#include <string.h>
#include <vector>

using namespace std;

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

const int MAX = 1005;

int C[MAX][MAX], father[MAX], Flow[MAX][MAX];
queue < int > Q;
vector < int > G[MAX];
int max_flow;
int n, m;

/// in loc de doar o matrice graph fac 2 una de cost si una pt flow

int BFS(){

    bool viz[MAX];
    memset(viz, 0, sizeof(viz));
    Q.push(1);
    viz[1] = 1;
    father[1] = -1;

    while(!Q.empty()){
        int nod = Q.front();
        Q.pop();
        for(auto it: G[nod]){
            if(!viz[it] && C[nod][it] - Flow[nod][it] > 0){
                Q.push(it);
                viz[it] = 1;
                father[it] = nod;
            }
        }
    }
    return viz[n];
}

void ford(){

    while(BFS()){

        int path = INT_MAX;
        for(int it = n; it != 1; it = father[it]){

            int nod = father[it];
            path = min(C[nod][it] - Flow[nod][it], path);
        }

        for(int it = n; it != 1; it = father[it]){

            int nod = father[it];
            Flow[nod][it] += path;
            Flow[it][nod] -= path;
        }

        max_flow += path;
    }
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; ++i){
        int x, y, c;
        fin >> x >> y >> c;
        G[x].push_back(y);
        C[x][y] = c;
    }

    ford();

    fout << max_flow;
    return 0;
}