Cod sursa(job #2525419)

Utilizator Emil64Emil Centiu Emil64 Data 17 ianuarie 2020 12:29:11
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> g[1001];

int c[1001][1001]={0}, f[1001][1001]={0};
int n, m;

int p[1001]={0};
bool viz[1001];

bool bfs(){
    queue<int> q;
    q.push(1);
    memset(viz, false, sizeof(viz));
    viz[1] = true;
    while(!q.empty()){

        int nod = q.front();
        q.pop();
        if(nod!=n)
            for(int i=0; i<g[nod].size(); i++){
                int adi = g[nod][i];
                if(viz[adi] || f[nod][adi] == c[nod][adi])
                    continue;
                viz[adi] = true;
                q.push(adi);
                p[adi] = nod;
            }
    }
    if(viz[n])
        return true;
    return false;
}

int main()
{
    int i, a, b, cmax;
    ifstream _f("maxflow.in");
    ofstream _g("maxflow.out");

    _f >> n >> m;
    for(i=1; i<=m; i++){
        _f >> a >> b >> cmax;
        g[a].push_back(b);
        g[b].push_back(a);
        c[a][b] = cmax;
    }

    int flux, fmin;
    for(flux=0; bfs();){
        for(int j = 0; j< g[n].size(); j++){
            fmin = 0x3f3f3f3f;
            p[n] = g[n][j];
            if(!viz[p[n]] || c[p[n]][n] == f[p[n]][n])
                continue;
            for(int nod = n; nod!=1; nod = p[nod]){
                fmin = min(fmin, c[p[nod]][nod] - f[p[nod]][nod]);
            }
            for(int nod = n; nod!=1; nod = p[nod]){
                f[p[nod]][nod] += fmin;
                f[nod][p[nod]] -= fmin;
            }
            flux += fmin;
        }
    }

    _g << flux << "\n";

}