Cod sursa(job #1394472)

Utilizator BLz0rDospra Cristian BLz0r Data 20 martie 2015 12:43:38
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <bitset>
using namespace std;

#define Nmax 1002
#define inf 0x3f3f3f3f
#define pb push_back

FILE *f = fopen ( "maxflow.in", "r" );
FILE *g = fopen ( "maxflow.out", "w" );

int cap[Nmax][Nmax], flow[Nmax][Nmax], tata[Nmax], sursa, dest, maxflow;
queue < int > Q;
bitset < Nmax > viz;
vector < int > G[Nmax];

void resetall (){
    while ( !Q.empty() )
        Q.pop();
    viz.reset();
}

bool BFS (){
    vector < int > :: iterator it;

    resetall();

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

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

        if ( nod == dest )
            break;

        for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
                int now = *it;

                if ( viz[now] || cap[nod][now] == flow[nod][now] )
                    continue;

                Q.push ( now );
                tata[now] = nod;
                viz[now] = 1;
        }

        Q.pop();
    }

    return viz[dest];

}

void flux(){
    int fmin;
    vector < int > :: iterator it;

    while ( BFS() ){
        for ( it = G[dest].begin(); it < G[dest].end(); ++it ){
                int now = *it;
                if ( flow[now][dest] == cap[now][dest] || !viz[now] )
                    continue;

                tata[dest] = now;
                fmin = inf;

                for ( now = dest; now != sursa; now = tata[now] )
                    fmin = min ( fmin, cap[tata[now]][now] - flow[tata[now]][now] );

                if ( fmin == 0 )
                    continue;

                for ( now = dest; now != sursa; now = tata[now] ){
                    flow[tata[now]][now] += fmin;
                    flow[now][tata[now]] -= fmin;
                }
                maxflow += fmin;
        }
    }
}

int main(){
    int N, M, x, y, c;

    fscanf ( f, "%d%d", &N, &M );
    sursa = 1;
    dest = N;

    for ( int i = 1; i <= M; ++i ){
        fscanf ( f, "%d%d%d", &x, &y, &c );
        cap[x][y] += c;
        G[x].pb ( y );
        G[y].pb ( x );
    }

    flux ();

    fprintf ( g, "%d", maxflow );

    return 0;
}