Cod sursa(job #1454389)

Utilizator MaarcellKurt Godel Maarcell Data 26 iunie 2015 13:36:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#define NMAX 1010
#define INF (1<<30)
using namespace std;

int N,M,C[NMAX][NMAX],T[NMAX],F[NMAX][NMAX],q[NMAX]; vector<int> graf[NMAX];
bool v[NMAX];

bool BFS(){
    int i,j,nod,V;
    memset(v,0,sizeof(v));
    q[0]=q[1]=1;
    v[1]=1;

    for (i=1; i<=q[0]; i++){
        nod=q[i];

        if (nod==N) continue;
        for (j=0; j<graf[nod].size(); j++){
            V=graf[nod][j];
            if (C[nod][V]==F[nod][V] || v[V]) continue;
            q[++q[0]]=V;
            v[V]=1;
            T[V]=nod;
        }
    }

    return v[N];
}

int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d",&N,&M);

    int i,nod,flow,fmin,x,y,c;
    for (i=1; i<=M; i++){
        scanf("%d %d %d",&x,&y,&c);
        graf[x].push_back(y);
        graf[y].push_back(x);
        C[x][y]=c;
    }

    for (flow=0; BFS(); )
        for (i=0; i<graf[N].size(); i++){
            nod=graf[N][i];
            if (C[nod][N]==F[nod][N] || !v[nod]) continue;
            T[N]=nod;

            fmin=INF;
            for (nod=N; nod!=1; nod=T[nod])
                fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);

            if (fmin==0) continue;
            for (nod=N; nod!=1; nod=T[nod]){
                F[T[nod]][nod]+=fmin;
                F[nod][T[nod]]-=fmin;
            }

            flow+=fmin;
        }

    printf("%d\n",flow);
}