Cod sursa(job #966970)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 26 iunie 2013 21:03:56
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
///finally

#define Source 1
#define Sink N

using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

const int MAXN = 1005;
const int oo = ((1<<31) - 1);

vector <int> Graph[MAXN], tata(MAXN);
int C[MAXN][MAXN];
int N, M, maxFlow;


inline int bfs()
{
    queue <int> Q;
    bitset < MAXN > viz;
    for(Q.push(Source), viz[Source] = true  ; !Q.empty(); Q.pop())
    {
        int node = Q.front();
        if(node == Sink)
            continue;
        for(int i = Source ; i <= Sink ; ++ i)
            if(C[node][i] && !viz[i])
            {
                Q.push(i);
                tata[i] = node;
                viz[i] = true;
            }
    }
    return viz[Sink];
}

int main()
{
    cin >> N >> M;
    for(int i = 1, x, y, z; i <= M ; ++ i)
    {
        cin >> x >> y >> z;
        C[x][y] = z;
        Graph[x].push_back(y);
        Graph[y].push_back(x);
    }
    cin.close();
    for(maxFlow = 0 ; bfs() ; )
    {
        for(int i = Source; i < Sink ; ++ i)
            if(C[i][Sink])
            {
                tata[Sink] = i;
                int Flow = oo;
                for(int j = Sink ; j != Source ; j = tata[j])
                    if(C [ tata[j] ][j] < Flow)
                        Flow = C[tata[j]][j];
                if( !Flow )
                    continue;
                for(int j = Sink ; j != Source ; j = tata[j])
                    C[ tata[j] ][j] -= Flow,
                    C[j][ tata[j] ] += Flow;
                maxFlow += Flow;
            }
    }
    cout << maxFlow << "\n";
    cout.close();
    return 0;
}