Cod sursa(job #2049634)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 27 octombrie 2017 15:11:50
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");
vector<int> v[1001];
deque<int> Q;
int n,m,FL,T[1001],cap[1001][1001],flux[1001][1001],BF();
void read(),solve(),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);
        cap[X][Y]=Z;
    }
    while(BF())UPD();
    g<<FL;
    return 0;
}
int BF()
{
    int nod,i;
    for(i=2; i<=n; i++)T[i]=0;
    T[1]=-1;
    Q.resize(0);
    Q.push_back(1);
    for(; Q.size();Q.pop_front())
    {
        nod=Q.front();
        for(auto vec:v[nod])
        if(!T[vec])
        {
            if(T[vec])continue;
            if(cap[nod][vec]<=flux[nod][vec])continue;
            T[vec]=nod;
            Q.push_back(vec);
        }
    }
    return 0;
}
void UPD()
{
    int j,FC;
    for(auto i:v[n])
        if(T[i]&&cap[i][n]>flux[i][n])
        {
            FC=cap[i][n]-flux[i][n];
            for(j=i; j!=1; j=T[j])
                FC=min(FC,cap[T[j]][j]-flux[T[j]][j]);
            if(FC)
            {
                FL+=FC;
                flux[i][n]+=FC;
                flux[n][i]-=FC;
                for(j=i; j!=1; j=T[j])
                {
                    flux[T[j]][j]+=FC;
                    flux[j][T[j]]-=FC;
                }
            }
        }
}