Cod sursa(job #1418538)

Utilizator tudi98Cozma Tudor tudi98 Data 13 aprilie 2015 13:51:59
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 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]--];

        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;
            if(p == N) return 1;
        }
    }

    return 0;
}

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()){
        int minflow = inf;

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

        if(minflow == 0) 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";
}