Cod sursa(job #2503284)

Utilizator victorzarzuZarzu Victor victorzarzu Data 2 decembrie 2019 19:55:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m;
vector<vector<int>> a(1001,vector<int>());
int c[1001][1001];
int cd[1001],TT[1001];
bool viz[1001];
int F[1001][1001];

void Citire()
{
    int x,y,capacitate;
    f>>n>>m;
    for(int i=1;i<=m;++i)
    {
        f>>x>>y>>capacitate;
        c[x][y] = capacitate;
        a[x].push_back(y);
        a[y].push_back(x);
    }
}


bool BF()
{
    int nod,V;
    memset(viz,false,sizeof viz);
    cd[0] = cd[1] = 1;
    viz[1] = true;
    for(int i=1;i<=cd[0];++i)
    {
        nod = cd[i];
        if(nod == n) continue;
        for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
        {
            V = *it;
            if(c[nod][V] == F[nod][V] || viz[V]) continue;
            viz[V] = true;
            cd[++cd[0]] = V;
            TT[V] = nod;
        }
    }

    return viz[n];
}

int main()
{
    int fmin,flow,nod;
    Citire();
    for(flow = 0;BF();)
        for(vector<int>::iterator it=a[n].begin();it!=a[n].end();++it)
        {
            nod = *it;
            if(F[nod][n] == c[nod][n] || !viz[nod]) continue;
            TT[n] = nod;

            fmin = INFINITY;
            for(nod = n; nod != 1; nod = TT[nod])
                fmin = min(fmin,c[TT[nod]][nod] - F[TT[nod]][nod]);
            if(fmin == 0) continue;
            for(nod = n; nod != 1; nod = TT[nod])
            {
                F[TT[nod]][nod] +=fmin;
                F[nod][TT[nod]] -=fmin;
            }

            flow += fmin;
        }
    g<<flow;
    return 0;
}