Cod sursa(job #2124459)

Utilizator KemyKoTeo Virghi KemyKo Data 7 februarie 2018 11:14:46
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define NMAX 1001

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m, FL;
int c[NMAX][NMAX], f[NMAX][NMAX], t[NMAX];
vector <int> v[NMAX];

int BF(int s, int d)
{
    int nod, vec, sz, j;
    queue <int> Q;
    memset(t, 0, sizeof(t));

    t[s]=-1;
    Q.push(s);

    while(!Q.empty())
    {
        nod = Q.front();
        Q.pop();

        sz = v[nod].size();
        for(j=0; j<sz; ++j)
        {
            vec = v[nod][j];

            if(t[vec] || c[nod][vec]==f[nod][vec])
                continue;

            t[vec] = nod;
            Q.push(vec);

            if(vec==d)return 1;
        }
    }
    return 0;
}

void dinic(int s, int d)
{
    int i, j, FC;
    while(BF(s, d))
    {
        for(i=1; i<=n; ++i)
        {
            if(!t[i] || c[i][d]==f[i][d] || c[i][n]==0)
                continue;

            FC = c[i][d]-f[i][d];

            for(j=i; j>s; j=t[j])
                FC=min(FC, c[t[j]][j]-f[t[j]][j]);

            if(!FC)
                continue;

            f[i][d]+=FC;
            f[d][i]-=FC;

            for(j=i; j>s; j=t[j])
            {
                f[t[j]][j]+=FC;
                f[j][t[j]]-=FC;
            }

            FL+=FC;
        }
    }
}

int main()
{
    int i, x, y, cap;

    fin>>n>>m;
    for(i=1; i<=m; ++i)
    {
        fin>>x>>y>>cap;

        v[x].push_back(y);
        v[y].push_back(x);
        c[y][x]=0;
        c[x][y]=cap;
    }

    dinic(1, n);

    fout<<FL;
    return 0;
}