Cod sursa(job #1176368)

Utilizator marcelPFake name marcelP Data 26 aprilie 2014 00:03:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define MAX 1010
#define pb push_back
#define INF 1<<29
queue <int> Q;
vector <int> G[MAX];
typedef vector <int> :: iterator iter;
int viz[MAX], nod, C[MAX][MAX], F[MAX][MAX], dad[MAX], n, m, a, b, c;

bool bf()
{
    memset(viz, 0, sizeof(viz));
    Q.push(1);
    viz[1]=1;
    while(Q.size())
    {
        nod=Q.front();
        Q.pop();
        if(nod==n)
            continue;

        for(iter it=G[nod].begin();it!=G[nod].end();it++)
        {
            if(!viz[*it] && F[nod][*it]!=C[nod][*it])
            {
                dad[*it]=nod;
                Q.push(*it);
                viz[*it]=1;
            }
        }
    }
    return viz[n];
}

int main()
{
    int minim;
    fin>>n>>m;
    while(m--)
    {
        fin>>a>>b>>c;
        G[a].pb(b);
        G[b].pb(a);
        C[a][b]=c;
    }
    int i;
    int flow=0;
    while(bf())
    {
        for(iter it=G[n].begin();it!=G[n].end();it++)
        {

            dad[n]=*it;
            if(F[*it][n]==C[*it][n] || !viz[*it])
                continue;
            minim=INF;
            for(i=n;i!=1;i=dad[i])
            {
                minim=min(minim, C[dad[i]][i]-F[dad[i]][i]);

            }
            flow+=minim;
            for(i=n;i!=1;i=dad[i])
            {
                F[dad[i]][i]+=minim;
                F[i][dad[i]]-=minim;
            }
        }
    }
    fout<<flow;
}