Cod sursa(job #1404392)

Utilizator danalex97Dan H Alexandru danalex97 Data 28 martie 2015 07:03:40
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;

ifstream F("maxflow.in");
ofstream G("maxflow.out");

const int N = 1010;

int n,m,dad[N],cap[N][N],flow;
vector<int> v[N];

int have_flow()
{
    memset(dad,0,sizeof(dad));

    queue<int> q;
    q.push( 1 );
    while ( !q.empty() )
    {
        int x = q.front();
        q.pop();

        for (int i=0;i<int(v[x].size());++i)
        {
            int y = v[x][i];
            if ( !dad[y] && cap[x][y] )
            {
                q.push(y);
                dad[y] = x;
            }
        }
    }
    return dad[n] != 0;
}

int main()
{
    F>>n>>m;
    for (int i=1,x,y,c;i<=m;++i)
    {
        F>>x>>y>>c;
        v[ x ].push_back( y );
        v[ y ].push_back( x );
        cap[x][y] = c;
    }
    while ( have_flow() )
        for (int i=0;i<int(v[n].size());++i)
        {
            int x = v[n][i];
            int cp = cap[x][n];
            for (int y=x;y!=1;y=dad[y])
                cp = min(cp,cap[dad[y]][y]);
            for (int y=x;y!=1;y=dad[y])
            {
                cap[dad[y]][y] -= cp;
                cap[y][dad[y]] += cp;
            }
            cap[x][n] -= cp;
            flow += cp;
        }
    G<<flow<<'\n';
}