Cod sursa(job #2134170)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 17 februarie 2018 18:18:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;
#define inf 110005
#define nmax 1005

FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");

vector<int>Q[nmax];

int n,m,tata[nmax],cost[nmax][nmax],costutilizat[nmax][nmax],flow,mnflow,yetnoduri[nmax],nrnoduri;
bool viz[nmax];

void read()
{
    fscanf(f,"%d %d",&n,&m);
    for (int i=1;i<=m;++i)
    {
        int a,b,c;
        fscanf(f,"%d %d %d",&a,&b,&c);
        Q[a].push_back(b);
        Q[b].push_back(a);
        cost[a][b]=c;
    }
    tata[1]=inf;
}

int BF()
{
    memset(viz,0,sizeof(viz));
    yetnoduri[1]=1;
    nrnoduri=1;
    for (int i=1;i<=nrnoduri;++i)
    {
        int nod=yetnoduri[i];
        if (nod==n)
            continue;
        for (auto w:Q[nod])
        {
            if (cost[nod][w]==costutilizat[nod][w]||viz[w])
                continue;
            viz[w]=true;
            yetnoduri[++nrnoduri]=w;
            tata[w]=nod;
        }
    }
    return viz[n];
}

void solve()
{
    for (flow=0;BF();)
    {
        for (auto w:Q[n])
        {
            if (cost[w][n]==costutilizat[w][n])
                continue;
            mnflow=inf;
            tata[n]=w;
            for(int i=n;i!=1;i=tata[i])
                mnflow=min(mnflow,cost[tata[i]][i]-costutilizat[tata[i]][i]);
            if (mnflow==0)
                continue;
            for (int i=n;i!=1;i=tata[i])
            {
                costutilizat[tata[i]][i]+=mnflow;
                costutilizat[i][tata[i]]-=mnflow;
            }
            flow+=mnflow;
        }
    }
    fprintf(g,"%d",flow);
}

int main()
{
    read();
    solve();
    return 0;
}