Cod sursa(job #1712130)

Utilizator Mr.RobotElliot Alderson Mr.Robot Data 2 iunie 2016 09:20:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define N 1001

vector < int > l[N];
int c[N][N], f[N][N], viz[N], t[N], n, m, x, y, z;

int BFS()
{
    queue < int > q;
    int x;
    for( int i = 1; i <= n; ++ i )
        viz[i] = 0;
    viz[1] = 1;
    q.push(1);

    while( !q.empty() )
    {
        x = q.front();
        q.pop();

        if( x != n )
        {
            for( vector < int > :: iterator it = l[x].begin(); it != l[x].end(); ++ it )
                if( viz[ *it ] == 0 && c[x][*it] - f[x][*it] > 0 )
                {
                    viz[*it] = 1;
                    q.push(*it);
                    t[*it] = x;
                }
        }
    }

    return viz[n];
}


int main()
{
    in >> n >> m;
    long long sol = 0;
    for( int i = 0; i < m; ++ i )
    {
        in >> x >> y >> z;
        c[x][y] = z;
        l[x].push_back(y);
        l[y].push_back(x);
    }

    while( BFS() )
    {
        for( vector < int > :: iterator it = l[n].begin(); it != l[n].end(); ++ it )
        {
            if( viz[*it] == 1 && c[*it][n] - f[*it][n] > 0 )
            {
                t[n] = *it;
                int fmin = 2000000000;

                for( int x = n; t[x]; x = t[x] )
                    if( c[t[x]][x] - f[t[x]][x] < fmin )
                        fmin = c[t[x]][x] - f[t[x]][x];

                if( fmin > 0 )
                {
                    for( int x = n; t[x]; x = t[x] )
                    {
                        f[t[x]][x] += fmin;
                        f[x][t[x]] -= fmin;
                    }
                }

                sol += fmin;
            }
        }
    }

    g << sol;
    return 0;
}