Cod sursa(job #1953942)

Utilizator dnprxDan Pracsiu dnprx Data 5 aprilie 2017 09:29:35
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define nmax 1001
#define oo 1000000000

using namespace std;

int n, m, S, D;
int c[nmax][nmax]; /// c[i,j]=capacitatea de transport a muchiei ij
int f[nmax][nmax]; /// f[i,j]=fluxul de pe muchia ij
int t[nmax];       /// t[i]=nodul precendent din drumul de crestere de la S la i
int flux;

void Citire()
{
    int i, x, y, cost;
    ifstream fin("maxflow.in");
    fin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> cost;
        c[x][y] = cost;
    }
    S = 1; D = n;
    fin.close();
}

/// returneaza 1 daca exista drum de crestere de la s la d
int BFS(int s, int d)
{
    int pr, ul, nod, i, q[nmax];
    memset(t, 0, sizeof(t));
    pr = ul = 0;
    q[pr] = s;
    t[s] = -1;
    while (pr <= ul)
    {
        nod = q[pr++];
        for (i = 1; i <= n; i++)
            if (t[i] == 0 && c[nod][i] > f[nod][i])
            {
                q[++ul] = i;
                t[i] = nod;
                if (i == d) return 1;
            }
    }
    return 0;
}

void FluxMaxim()
{
    int i, r;
    for (flux = 0; BFS(S, D); flux += r)
    {
        r = oo;
        i = D;
        while (i != S)
        {
            r = min(r, c[t[i]][i] - f[t[i]][i]);
            i = t[i];
        }
        i = D;
        while (i != S)
        {
            f[t[i]][i] += r;
            f[i][t[i]] -= r;
            i = t[i];
        }
    }
}

void Afisare()
{
    ofstream fout("maxflow.out");
    fout << flux << "\n";
    fout.close();
}

int main()
{
    Citire();
    FluxMaxim();
    Afisare();
    return 0;
}