Cod sursa(job #2807227)

Utilizator lucriLuchian Cristian lucri Data 23 noiembrie 2021 16:33:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m,x[5010],y[5010],c[1010][1010],f[1010][1010],z,ant[1010],r;
vector<vector<int>>a;
bool v[1010];
bool drum()
{
    for(int i=2;i<=n;++i)
        v[i]=false;
    v[1]=true;
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        if(x==n)
            continue;
        for(auto t:a[x])
        {
            if(v[t]==true||c[x][t]==f[x][t])
                continue;
            q.push(t);
            ant[t]=x;
            v[t]=true;
        }
    }
    return v[n];
}
int umplere()
{
    int fmin;
    while(drum())
    {
        for(auto x:a[n])
        {
            ant[n]=x;
            if(v[x]==false||f[x][n]==c[x][n])
                continue;
            fmin=1000000010;
            for(int t=n;t!=1;t=ant[t])
                fmin=min(fmin,c[ant[t]][t]-f[ant[t]][t]);
            if(fmin==0)
                continue;
            for(int t=n;t!=1;t=ant[t])
            {
                f[ant[t]][t]+=fmin;
                f[t][ant[t]]-=fmin;
            }
            r+=fmin;
        }
    }
    return r;
}
int main()
{
    in>>n>>m;
    a.resize(n+5);
    for(int i=1;i<=m;++i)
    {
        in>>x[i]>>y[i]>>z;
        c[x[i]][y[i]]+=z;
        a[x[i]].push_back(y[i]);
        a[y[i]].push_back(x[i]);
    }
    out<<umplere();
    return 0;
}