Cod sursa(job #991110)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 august 2013 19:02:24
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstring>
#include <vector>

#define vint vector<int>::iterator
#define inf 1<<30
#define maxn 1001

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

vector<int> G[maxn];
int q[maxn],F[maxn][maxn],C[maxn][maxn],T[maxn];
bool viz[maxn];

int n,m,a,b,c,flow;

bool BFS ()
{
    int l=1;
    q[l]=1;
    memset (viz,0,n+1);
    viz[1]=1;

    for (int s=1; s<=l; ++s)
    {
        if (q[s]==n) continue;
        int node = q[s];
        for (vint it = G[node].begin(); it!=G[node].end(); ++it)
        {
            if (C[node][*it]-F[node][*it] == 0 || viz[*it]) continue;
            viz[*it] = 1;
            q[++l] = *it;
            T[*it] = node;
        }
    }
    return viz[n];
}

int main()
{
    fin>>n>>m;

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

    while (BFS())
    {
        for (vint it = G[n].begin(); it!=G[n].end(); ++it)
        {
            if (!viz[*it] || C[*it][n]-F[*it][n] ==0) continue;
            T[n] = *it;

            int minf=inf;
            for (int i = n; i!=1; i=T[i])
               minf = min(minf,C[T[i]][i] - F[T[i]][i]);
            if (minf==0) continue;

            for (int i = n; i!=1; i=T[i])
            {
                F[T[i]][i] += minf;
                F[i][T[i]] -= minf;
            }
            flow+=minf;
        }
    }

    fout<<flow;
}