Cod sursa(job #2414279)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 24 aprilie 2019 14:03:04
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int NMAX = 1001;
const int INF = 2000000000;

int N, M;

vector < int > Ad[NMAX];

int cap[NMAX][NMAX];
int flow[NMAX][NMAX];

int vis[NMAX];
int parent[NMAX];

void Read()
{
    fin >> N >> M;

    int x, y, c;

    for( int i = 1; i <= M; ++i )
    {
        fin >> x >> y >> c;

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

        cap[x][y] = c;
    }

    fin.close();
}

bool BFS()
{
    for( int i = 1; i <= N; ++i ) vis[i] = 0;

    queue < int > Q;

    Q.push( 1 );

    vis[1] = 1;

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

        if( nod == N ) continue;

        for( int i = 0; i < Ad[nod].size(); ++i )
        {
            int w = Ad[nod][i];

            if( !vis[w] && cap[nod][w] - flow[nod][w] > 0 )
            {
                parent[w] = nod;

                vis[w] = 1;
                Q.push( w );
            }
        }
    }

    return vis[N];

}

void Do()
{
    int flow_total = 0;
    int flow_curent;

    while( BFS() )
    {
        for( int i = 0; i < Ad[N].size(); ++i )
        {
            int w = Ad[N][i];
            flow_curent = INF;

            if( vis[w] && cap[w][N] - flow[w][N] > 0 )
            {
                parent[N] = w;

                for( int i = N; i != 1; i = parent[i] )
                    flow_curent = min( flow_curent, cap[parent[i]][i] - flow[parent[i]][i] );

                for( int i = N; i != 1; i = parent[i] )
                {
                    flow[parent[i]][i] += flow_curent;
                    flow[i][parent[i]] -= flow_curent;
                }

                flow_total += flow_curent;
            }
        }
    }

    fout << flow_total << '\n';
}

int main()
{
    Read();
    Do();
    return 0;
}