Cod sursa(job #1274613)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 24 noiembrie 2014 00:10:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream ka("maxflow.in");
ofstream ki("maxflow.out");
const int N_MAX = 1000;

vector <int> graf[N_MAX + 1];

int c[N_MAX + 1][N_MAX + 1];
int f[N_MAX + 1][N_MAX + 1];
int previous[N_MAX + 1];
int coada[N_MAX + 1];

bool vizitat[N_MAX + 1];

int n, m, x, y, z;
int flux = 0;

bool bfs()
{
    coada[0] = 1;
    coada[1] = 1;
    for(int i = 1; i <= n; i++)
        vizitat[i] = false;
    vizitat[1] = true;
    for(int i = 1; i <= coada[0]; i++)
    {
        int nod = coada[i];
        if(nod == n)
            continue;
        for(int j = 0; j < graf[nod].size(); j++)
        {
            int v = graf[nod][j];
            if(c[nod][v] == f[nod][v] || vizitat[v])
                continue;
            vizitat[v] = true;
            coada[++coada[0]] = v;
            previous[v] = nod;
        }
    }
    return vizitat[n];
}

int main()
{
    ka >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        ka >> x >> y >> z;
        c[x][y] = z;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
    while(bfs())
    {
        for(int i = 0; i < graf[n].size(); i++)
        {
            int nod = graf[n][i];
            if(c[nod][n] == f[nod][n] || !vizitat[nod])
                continue;
            previous[n] = nod;
            int flux_min = 0x7fffffff;
            for(nod = n; nod != 1; nod = previous[nod])
                flux_min = min(flux_min, c[previous[nod]][nod] - f[previous[nod]][nod]);
            if(flux_min == 0)
                continue;
            for(nod = n; nod != 1; nod = previous[nod])
            {
                f[previous[nod]][nod] += flux_min;
                f[nod][previous[nod]] -= flux_min;
            }
            flux += flux_min;
        }
    }
    ki << flux;
}