Cod sursa(job #1865616)

Utilizator borcanirobertBorcani Robert borcanirobert Data 1 februarie 2017 21:13:26
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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(); )
    {
        int flow = Inf;

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

        for ( int i = N; 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);

            if ( v == N ) return true;
        }
    }

    return false;
}