Cod sursa(job #1262789)

Utilizator ZenusTudor Costin Razvan Zenus Data 13 noiembrie 2014 16:00:16
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>

using namespace std;

#define NMAX 1007

vector < int > G[NMAX];
vector < int > :: iterator u;
queue < int > Q;
int total,fmin,X,node,Y,Z,N,M;
int C[NMAX][NMAX],F[NMAX][NMAX];
bool marked[NMAX];
int T[NMAX];

bool bf()
{
    Q.push(1);
    marked[1]=true;
    int node;
    memset(marked,false,sizeof(marked));

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

        if (node==N) continue;

        for (u=G[node].begin();u!=G[node].end();++u)
        {
            if (marked[*u] || C[node][*u]==F[node][*u]) continue;

            Q.push(*u);
            marked[*u]=true;
            T[*u]=node;
        }
    }

    return marked[node];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    for (scanf("%d%d",&N,&M);M;--M)
    {
        scanf("%d%d%d",&X,&Y,&Z);

        C[X][Y]+=Z;
        G[X].push_back(Y);
        G[Y].push_back(X);
    }

    while (bf())
    for (u=G[N].begin();u!=G[N].end();++u)
    {
        if (F[*u][N]==C[*u][N] || !marked[*u]) continue;

        for (node=N,T[N]=*u,fmin=INT_MAX;node!=1;node=T[node])
        fmin=min(fmin,C[T[node]][node]-F[T[node]][node]);

        if (!fmin) continue;

        for (node=N;node!=1;node=T[node])
        {
            F[T[node]][node]+=fmin;
            F[node][T[node]]-=fmin;
        }

        total+=fmin;
    }

    printf("%d\n",total);

    return 0;
}