Cod sursa(job #1960281)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 10 aprilie 2017 12:34:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1005;

queue<int> coada;
vector<int> graf[MAXN];
int n, m, capacitate[MAXN][MAXN], flux[MAXN][MAXN];
int tata[MAXN];

int parcurgere()
{
    coada.push(1);

    tata[1] = 1;

    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        if(nod != n)
        {
            for(int vecin : graf[nod])
            {
                if(!tata[vecin] && capacitate[nod][vecin] != flux[nod][vecin])
                {
                    tata[vecin] = nod;
                    coada.push(vecin);
                }
            }
        }
    }
    return tata[n];
}

int Flux;

void adauga(int nod)
{
    if(!tata[nod] || capacitate[nod][n] == flux[nod][n])
        return;

    int minim = capacitate[nod][n] - flux[nod][n];

    for(int i = nod; i != 1; i = tata[i])
        minim = min(minim, capacitate[tata[i]][i] - flux[tata[i]][i]);

    flux[nod][n] += minim;
    flux[n][nod] -= minim;

    Flux += minim;

    if(!minim) return;

    for(int i = nod; i != 1; i = tata[i])
    {
        flux[i][tata[i]] -= minim;
        flux[tata[i]][i] += minim;
    }
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    for([]()
    {
        scanf("%d %d",&n,&m);
        for(int i = 1; i <= m; i++)
        {
            int a, b, cp;
            scanf("%d %d %d ",&a,&b,&cp);
            capacitate[a][b] = cp;
            graf[a].push_back(b);
            graf[b].push_back(a);
        }
    }(); parcurgere();)
    {
        for(int nod : graf[n])
            adauga(nod);

        memset(tata,0,sizeof(tata));
    }

    printf("%d\n",Flux);

    return 0;
}