Cod sursa(job #2447830)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 14 august 2019 19:30:39
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream inf("maxflow.in");
ofstream outf("maxflow.out");

const int N=1010;

int n, m, cap[N][N], vis[N], fl[N][N], t[N];
int mf;
vector<int> v[N];

int bf();
void upd();

int main()
{
    inf>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x, y, z;
        inf>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y]=z;
    }
    while(bf())
        upd();
    outf<<mf;

    return 0;
}

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

    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(auto it:v[x])
        {
            if(t[it])
                continue;
            if(cap[x][it]==fl[x][it])
                continue;
            t[it]=x;
            q.push(it);
        }
    }

    return t[n];
}

void upd()
{
    int currF;
    for(int i=1; i<=n; i++)
    {
        if(!t[i])
            continue;
        if(cap[i][n]==fl[i][n])
            continue;
        currF=cap[i][n]-fl[i][n];
        for(int j=i; j!=1; j=t[j])
        {
            currF=min(currF, cap[t[j]][j]-fl[t[j]][j]);
        }
        if(!currF)
            continue;

        mf+=currF;

        fl[i][n]+=currF;
        fl[n][i]-=currF;

        for(int j=i; j!=1; j=t[j])
        {
            fl[t[j]][j]+=currF;
            fl[j][t[j]]-=currF;
        }
    }
}