Cod sursa(job #1418548)

Utilizator tudi98Cozma Tudor tudi98 Data 13 aprilie 2015 14:06:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define dim 1005
#define inf (1LL<<31)-1

int N,M;
int capacity[dim][dim],flow[dim][dim];
int T[dim];
vector<int> v[dim];
bool seen[dim];
queue<int> Q;

bool bfs()
{
    memset(seen,0,sizeof seen);
    Q.push(1);
    seen[1] = 1;

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

        if(u == N) continue;

        for(auto p: v[u]){
            if(seen[p] || capacity[u][p] == flow[u][p])
                continue;

            T[p] = u;
            seen[p] = 1;
            Q.push(p);
        }
    }

    return seen[N];
}

int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");

    fin >> N >> M;

    for(int i = 1; i <= M; i++){
        int x,y,z;
        fin >> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        capacity[x][y] = z;
    }

    int maxflow = 0;
    while(bfs()){
        for(auto p: v[N]){
            if(flow[p][N] == capacity[p][N] || !seen[p])
                continue;

            int minflow = inf;
            T[N] = p;

            for(int i = N; i != 1; i = T[i])
                minflow = min(minflow,capacity[T[i]][i] - flow[T[i]][i]);

            if(!minflow) continue;

            for(int i = N; i != 1; i = T[i]){
                flow[T[i]][i] += minflow;
                flow[i][T[i]] -= minflow;
            }

            maxflow += minflow;
        }
    }

    fout << maxflow << "\n";
}