Cod sursa(job #2208296)

Utilizator hegedusPaul Hegedus hegedus Data 29 mai 2018 01:45:26
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 1000
#define infinit 2000000000

ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<int> A[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX];
int n,m;

bool ameliorare(int sursa, int destinatie){
    int Q[n+1];
    int q = 1;
    bool vizitat[n+1];
    for(int i=1; i<=n; i++) vizitat[i] = false;
    for(int i=1; i<=n; i++) T[i] = 0;

    Q[0] = sursa;
    vizitat[sursa] = true;

    for(int i=0;i<q;i++){
        int nod = Q[i];
        for(unsigned int j = 0; j < A[nod].size(); j++){
            int vecin = A[nod][j];
            if(!vizitat[vecin] && C[nod][vecin] - F[nod][vecin] > 0){
                Q[q++] = vecin;
                T[vecin] = nod;
                vizitat[vecin] = true;
            }
        }
    }

    if (vizitat[destinatie]) return true;
    return false;
}

int main()
{
    int flux = 0;
    f >> n >> m;
    int sursa = 1, destinatie = n;

    for(int i=0; i<m; i++){
        int nod1, nod2, cost;
        f >> nod1 >> nod2 >> cost;
        C[nod1][nod2] = cost;
        A[nod1].push_back(nod2);
    }

    while(ameliorare(sursa,destinatie)){

        int saturare = infinit;

        for(int nod = destinatie; nod != sursa; nod = T[nod])
            if (saturare > C[T[nod]][nod] - F[T[nod]][nod])
                saturare = C[T[nod]][nod] - F[T[nod]][nod];

        for(int nod = destinatie; nod != sursa; nod = T[nod])
            F[T[nod]][nod] += saturare;

        flux += saturare;
    }

    g << flux;

    return 0;
}