Cod sursa(job #2053747)

Utilizator zeboftwAlex Mocanu zeboftw Data 1 noiembrie 2017 11:36:02
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<bits/stdc++.h>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int N = 1001;
vector<int> v[N];

queue<int> Q;

int n , m , FL, t[1001], C[1001][1001], F[1001][1001], BF();

void UPD();

int main()
{
    int X,Y,Z;
    f>>n>>m;
    for(;m;m--)
    {
        f>>X>>Y>>Z;
        v[X].push_back(Y);
        v[Y].push_back(X);
        C[X][Y]=Z;
    }

    while(BF())
        UPD();

    g<<FL<<'\n';

    return 0;
}

int BF()
{
    int nod;
    for(int i=2;i<=n;i++)t[i]=0;
    t[1]=-1;
    queue<int> Q;
    Q.push(1);

    for(;Q.size();)
    {
        nod=Q.front();Q.pop();
        for(auto vec :v[nod])
        {
            if(t[vec])continue;
            if(C[nod][vec]==F[nod][vec])continue;

            t[vec]=nod;

            Q.push(vec);

            //if(vec==n)return 1;
        }

    }

    return t[n];
}

void UPD()
{
    int i,j,FC;

    for(i=1;i<=n;i++)
    {
        if(!t[i])continue;

        if(C[i][n]==F[i][n])continue;

        FC=C[i][n]-F[i][n];
        for(j=i;j!=1;j=t[j])
            FC=min(FC,C[t[j]][j]-F[t[j]][j]);

        if(!FC)continue;

        FL+=FC;

        F[i][n]+=FC;F[n][i]-=FC;

        for(j=i;j!=1;j=t[j])
        {
            F[t[j]][j]+=FC;
            //F[j][t[j]]-=FC;
        }
    }
}