Cod sursa(job #2328364)

Utilizator DianaVelciovVelciov Diana DianaVelciov Data 25 ianuarie 2019 17:43:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

const int N_MAX = 1000, oo = 2e9;
int q[N_MAX + 5], use[N_MAX + 5], TT[N_MAX + 5];
int c[N_MAX + 5][N_MAX + 5], N, M, flow, F[N_MAX + 5][N_MAX + 5];
vector <int> G[N_MAX + 5];

void read(){
    in >> N >> M;
    for (int i = 1; i <= M; ++i){
        int x, y, z; in >> x >> y >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y] = z;
    }
}

int bfs(){
    for (int i = 1; i <= N; ++i)
        use[i] = TT[i] = 0;
    q[1] = q[0] = 1;
    use[1] = 1;
    for (int i = 1; i <= q[0]; ++i){
        int node = q[i];
        if (node == N) continue; ///in plus
        for (int i = 0; i < (int)G[node].size(); ++i){
            int vecin = G[node][i];
            if (use[vecin] || c[node][vecin] == F[node][vecin]) continue;
            TT[vecin] = node;
            q[++q[0]] = vecin;
            use[vecin] = 1;
            ///if (vecin == N) return 1; in minus
        }
    }
    return use[N]; ///in plus
}

void print(){
    out << flow << '\n';
}

int main(){
    read();

    while(bfs())
        for (int i = 0; i < (int)G[N].size(); ++i){
            TT[N] = G[N][i];
            if (F[TT[N]][N] == c[TT[N]][N] || !use[TT[N]]) continue;
            int Fmin = oo;
            for (int i = N; i != 1; i = TT[i])
                Fmin = min(Fmin, c[TT[i]][i] - F[TT[i]][i]);
            for (int i = N; i != 1; i = TT[i]){
                F[TT[i]][i] += Fmin;
                F[i][TT[i]] -= Fmin;
            }
            flow += Fmin;
        }

    /*while(bfs()){
        int Fmin = oo;
        for (int i = N; i != 1; i = TT[i])
            Fmin = min(Fmin, c[TT[i]][i] - F[TT[i]][i]);
        for (int i = N; i != 1; i = TT[i]){
            F[TT[i]][i] += Fmin;
            F[i][TT[i]] -= Fmin;
        }
        flow += Fmin;
    }*/

    print();

    return 0;
}

///flux maxim
///traseu, plan