Cod sursa(job #1399115)

Utilizator killlerr1Chilom Mircea killlerr1 Data 24 martie 2015 16:15:12
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <bitset>
#include <queue>

using namespace std;

ifstream is("maxflow.in");
ofstream os("maxflow.out");

const int MAXN = 1005;
const int INF = 0x3f3f3f3f;

int n, m, c[MAXN][MAXN], t[MAXN];
vector<int> G[MAXN];
bitset<MAXN> v;
queue<int> Q;

inline bool Bfs(int source, int sink)
{
    v.reset();
    v[source] = 1;
    Q.push(source);
    int x;
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(const auto& e : G[x])
            if(!v[e] && c[x][e] > 0)
            {
                v[e] = 1;
                t[e] = x;
                Q.push(e);
            }
    }
    return v[sink];
}

inline int maxflow(int source, int sink)
{
    int maxflow = 0, fmin;

    while(Bfs(source, sink))
        for( const auto& e : G[source] )
        {
            if(!v[e] || c[e][sink] <= 0)
                continue;
            t[sink] = e;
            for( int i = sink; i != source; i = t[i] )
                fmin = min(fmin, c[t[i]][i]);

            for( int i = sink; i != source; i = t[i] )
            {
                c[t[i]][i] -= fmin;
                c[i][t[i]] += fmin;
            }
            maxflow += fmin;
        }
    return maxflow;


}

void Read();

int main()
{
    Read();
    os << maxflow(1, n);


    is.close();
    os.close();
    return 0;
}

void Read()
{
    is >> n >> m;

    int a, b, C;
    while( is >> a >> b >> C)
    {
        G[a].push_back(b);
        c[a][b] = C;
    }
}