Cod sursa(job #2874312)

Utilizator BorodiBorodi Bogdan Borodi Data 19 martie 2022 13:44:43
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <bitset>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <bitset>
#include <stack>
#include <queue>
#define Nmax 1005
using namespace std;

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

typedef vector <int> VI;
int n, m, x, y, c;
const int oo = 1 << 28;
bool Fr[Nmax];
int F[Nmax][Nmax], C[Nmax][Nmax], Dad[Nmax];
queue <int> Q;
VI V[Nmax];

bool BFS(int vertex){
    while(Q.size())Q.pop();
    Q.push(vertex);
    memset(Fr, 0, sizeof(Fr));
    Fr[vertex] = 1;

    while(Q.size()){
        vertex = Q.front();

        if(vertex == n)
            break;
   
        for(int new_vertex : V[vertex])
            if(!Fr[new_vertex] && F[vertex][new_vertex] != C[vertex][new_vertex]){
                Fr[new_vertex] = 1;
                Dad[new_vertex] = vertex;
                Q.push(new_vertex);
   
            }

        Q.pop();
    }

    return Fr[n];
}

int main() {
    fin >> n >> m;

    for(int i = 1; i <= m; ++i){
        fin >> x >> y >> c;
        V[x].push_back(y);
        V[y].push_back(x);
        C[x][y] += c;
    }   

    int flow = 0;

    while( BFS(1) ) {
        int fmin = oo;

        for(int node = n; node > 1; node = Dad[node])
            fmin = min(fmin, C[Dad[node]][node] - F[Dad[node]][node]);

        if(fmin == 0)
            continue;

        for(int node = n; node > 1; node = Dad[node]){
            F[Dad[node]][node] += fmin;
            F[node][Dad[node]] -= fmin;
        }

        flow += fmin;
    }

    fout << flow;

    return 0;
}