Cod sursa(job #2045928)

Utilizator AkrielAkriel Akriel Data 23 octombrie 2017 08:49:44
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<int> v[1001];
int n,m,FL,D[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;
    }
    for(;BF();)UPD();
    g<<FL;
    return 0;
}
int BF()
{
    int nod,i;
    for(i=2;i<=n;i++)D[i]=0;D[1]=-1;
    queue<int>Q;
    Q.push(1);
    for(;Q.size();Q.pop())
    {
        nod=Q.front();
        for(auto vec:v[nod])
        {
            if(D[vec])continue;
            if(C[nod][vec]<=F[nod][vec])continue;
            D[vec]=nod;
            Q.push(vec);
            if(vec==n)return 1;
        }
    }
    return 0;
}
void UPD()
{
    int i,j,k,FC;
    for(i=1;i<=n;i++)
    {
        if(!D[i])continue;
        if(C[i][n]<=F[i][n])continue;
        FC=C[i][n]-F[i][n];
        for(j=i,k=D[i];j!=1;j=D[j],k=D[j])
            FC=min(FC,C[k][j]);
        if(!FC)continue;
        FL+=FC;
        F[i][n]+=FC;F[n][i]-=FC;
        for(j=i,k=D[i];j!=1;j=D[j],k=D[j])
            F[k][j]+=FC,F[j][k]-=FC;
    }
}