Cod sursa(job #1865628)

Utilizator borcanirobertBorcani Robert borcanirobert Data 1 februarie 2017 21:22:12
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

using VI = vector<int>;
const int Inf = 0x3f3f3f3f;
const int MAX = 1005;
int N, M;
int C[MAX][MAX];
int f[MAX][MAX];
vector<vector<int>> G;
VI viz, t;

void Read();
bool BF();

int main()
{
    int ft{0};
    Read();

    for ( ; BF(); )
        for ( const auto& x : G[N] )
        {
            if ( viz[x] == 0 || C[x][N] == f[x][N] )
                continue;

            int flow = Inf;

            for ( int i = x; i != 1; i = t[i] )
                flow = min( flow, C[t[i]][i] - f[t[i]][i] );
            ft += flow;

            for ( int i = x; i != 1; i = t[i] )
            {
                f[t[i]][i] += flow;
                f[i][t[i]] -= flow;
            }
        }

    fout << ft << '\n';

    fin.close();
    fout.close();
    return 0;
}


void Read()
{
    int x, y, z;

    fin >> N >> M;
    G = vector<vector<int>>(N + 1);
    while ( M-- )
    {
        fin >> x >> y >> z;

        G[x].push_back(y);
        G[y].push_back(x);

        C[x][y] = z;
    }
}

bool BF()
{
    queue<int> Q;
    t = viz = vector<int>(N + 1, 0);

    viz[1] = 1;
    Q.push(1);

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

        for ( const auto& v : G[nod] )
        {
            if ( C[nod][v] == f[nod][v] || viz[v] ) continue;

            viz[v] = true;
            t[v] = nod;
            Q.push(v);
        }
    }

    return viz[N];
}