Cod sursa(job #1875639)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 11 februarie 2017 13:28:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <cstring>
#define Nmax 1002
#define inf 1e9
using namespace std;

ofstream g("maxflow.out");

int n,fw[Nmax][Nmax],C[Nmax],m,x,y,c,T[Nmax],rez;
bool viz[Nmax];
vector<int> V[Nmax];


bool bfs()
{
    C[0] = 0;
    C[++C[0]] = 1;
    memset(viz,0,sizeof(viz));
    for (int i=1;i<=C[0];i++)
    {
        int now = C[i];
        if (now == n)
            continue;
        for (int j=0;j<V[now].size();j++)
        {
            if (fw[now][V[now][j]]==0 || viz[V[now][j]])
                continue;
            C[++C[0]] = V[now][j];
            viz[V[now][j]] = 1;
            T[V[now][j]] = now;
        }
    }
    return viz[n];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    scanf("%d%d",&n,&m);

    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        fw[x][y] = c;
        V[x].push_back(y);
        V[y].push_back(x);
    }

    while (bfs())
    {
        for (int i=0;i<V[n].size();i++)
        {
            if (fw[V[n][i]][n]==0 || !viz[V[n][i]])
                continue;
            T[n] = V[n][i];

            int Fmin = inf;
            for (int nod = n; nod!=1; nod = T[nod])
                Fmin = min(Fmin,fw[T[nod]][nod]);

            for (int nod = n; nod!=1; nod = T[nod])
            {
                fw[T[nod]][nod] -= Fmin;
                fw[nod][T[nod]] += Fmin;
            }
            rez+=Fmin;
        }
    }

    g<<rez;

    return 0;
}