Cod sursa(job #1399132)

Utilizator killlerr1Chilom Mircea killlerr1 Data 24 martie 2015 16:23:33
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 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);
    while(!Q.empty())
    {
        int x = Q.front();
        Q.pop();
        if( x == sink )
            continue;
        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;
            fmin = INF;
            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;


}

int main()
{
    is >> n >> m;

    int a, b, C;
    for( int i = 1; i <= m; ++i )
    {
        is >> a >> b >> C;
        G[a].push_back(b);
        c[a][b] += C;
        G[b].push_back(a);
    }

    os << maxflow(1, n);


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