Cod sursa(job #1418536)

Utilizator tudi98Cozma Tudor tudi98 Data 13 aprilie 2015 13:49:59
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#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];
int ST[dim];

bool bfs()
{
    memset(seen,0,sizeof seen);
    ST[0] = 1;
    ST[1] = 1;
    seen[1] = 1;

    while(ST[0]){
        int u = ST[ST[0]--];
        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;
            ST[++ST[0]] = 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";
}