Cod sursa(job #2049659)

Utilizator carina_petcuPetcu Carina carina_petcu Data 27 octombrie 2017 15:20:10
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<bits/stdc++.h>

using namespace std;

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

const int N = 1001;

vector<int> v[N];
deque<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,i;

    for(i=2;i<=n;i++)t[i]=0;

    t[1]=-1;
    queue<int> Q;
    Q.clear(0);
    Q.push(1);
    for(;Q.size();)
    {
        nod=Q.front();
        Q.pop();
        for(auto vec :v[N])
        {
            if(t[vec])continue;
            if(C[nod][vec] == F[nod][vec])continue;
            t[vec] = nod;

            Q.push(nod);

            if(vec == n)return 1;
        }

    }

    return 0;
}
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;
        }
    }
}