Cod sursa(job #792765)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 29 septembrie 2012 20:33:52
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#define NM 1010
#define INF 999999999

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

queue<int> Q;
vector<int> G[NM];
int N,M,i,a,b,c;
int C[NM][NM],F[NM][NM];
int T[NM];
bool V[NM];
int ANS,FMIN;
unsigned int j;

bool BF ()
{
    memset(V,0,sizeof(V));
    V[1]=1;
    Q.push(1);

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

        if (a==N) continue;

        for (j=0; j<G[a].size(); j++)
        {
            if (F[a][G[a][j]]>=C[a][G[a][j]] || V[G[a][j]]) continue;
            V[G[a][j]]=1;
            T[G[a][j]]=a;
            Q.push(G[a][j]);
        }
    }

    return V[N];
}

int main ()
{
    f >> N >> M;

    for (i=1; i<=M; i++)
    {
        f >> a >> b >> c;
        C[a][b]+=c;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    while (BF())
    {
        FMIN=INF;

        for (a=N; a!=1; a=T[a])
            FMIN=min(C[T[a]][a]-F[T[a]][a],FMIN);

        if (FMIN==0) continue;

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

        ANS+=FMIN;
    }

    g << ANS << '\n';
    f.close();
    g.close();
    return 0;
}