Cod sursa(job #1283102)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 5 decembrie 2014 02:17:18
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> L[1010];
int T[1010], C[1010][1010], F[1010][1010], x, y, c, n, i, v[1010], s, p, u, q[1010], m;

int bfs(){
    memset(v, 0, sizeof (v));
    p = u = 1;
    q[1] = 1;
    v[1] = 1;
    while(p <= u){
        for(int i = 0; i < L[q[p]].size(); i ++)
            if(v[ L[q[p]][i] ] == 0 && C[q[p]][L[q[p]][i]] > F[q[p]][L[q[p]][i]] ){
                u ++;
                q[u] = L[q[p]][i];
                v[ L[q[p] ][i]] = 1;
                T[ L[q[p] ][i]] = q[p];
           }
        p ++;
    }
    return v[n];
}
int main()
{
    fin >> n >> m;
    int min = 0;
    for(i = 1; i <= m; i ++){
        fin >> x >> y >> c;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y] = c;
    }
    while(bfs()){
        for(i = 0; i < L[n].size(); i ++){
            x = L[n][i];
            if(C[x][n] > F[x][n] && v[x] == 1){
                min = C[x][n] - F[x][n];
                while(x != 1){
                    if(C[T[x]][x] - F[T[x]][x] < min)
                        min = C[T[x]][x] - F[T[x]][x];
                    x = T[x];
                }
                x = L[n][i];
                F[x][n] += min;
                F[n][x] -= min;
                while(x != 1){
                    F[ T[x] ][x] += min;
                    F[x][ T[x] ] -= min;
                    x = T[x];
                }
            s += min;
            }

        }


    }
    fout << s;
    return 0;
}