Cod sursa(job #2678867)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 28 noiembrie 2020 21:03:21
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

//ifstream f("date.in");
//ofstream g("data.out");
ifstream f("maxflow.in");
ofstream g("maxflow.out");
//#define f cin
//#define g cout

const int dim = 1e3 + 1;

int n, m, ff;
int gr[dim][dim];
int parents[dim];
bool mark[dim];
vector <int> v[dim];

bool bfs(){
    queue <int> q;
    q.push(1);

    memset(mark, 0, sizeof(mark));
    mark[1] = 1;

    while(!q.empty()){
        int node = q.front(); q.pop();
        if(node == n)
            continue;

        for(int i: v[node]){
            if(!mark[i] && gr[node][i] > 0){
                mark[i] = 1;
                parents[i] = node;
                q.push(i);
            }
        }
    }

    return mark[n];
}

int main()
{
    int i, j, a , b, c;

    f >> n >> m;

    for(i = 1; i <= m; ++i){
        f >> a >> b >> c;
        gr[a][b] = c;
        v[a].push_back(b);
    }

    while(bfs()){
        for(i = 1; i <= n; ++i){
            if(gr[i][n] > 0 && mark[i]){
                int floox = INT_MAX;
                parents[n] = i;

                for(a = n; a != 1; a = parents[a]){
                    b = parents[a];
                    floox = min(floox, gr[b][a]);
                }

                ff += floox;

                for(a = n; a != 1; a = parents[a]){
                    b = parents[a];
                    gr[b][a] -= floox;
                    gr[a][b] += floox;
                }
            }
        }
    }

    g << ff;

    return 0;
}