Cod sursa(job #2739084)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 6 aprilie 2021 19:51:39
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include<bits/stdc++.h>

using namespace std;

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

queue<int> Q;
vector<int> G[1005];
int viz[1005], tata[1005], C[1005][1005], flow[1005][1005];
int mincap, maxflow, n, m;

bool bfs(){
    int i,top,vecin;
    for(i = 1; i <= n; ++i){
        tata[i] = 0;
        viz[i] = 0;
    }
    viz[1] = 1;
    Q.push(1);
    while(!Q.empty()){
        top = Q.front();
        Q.pop();
        for(i = 0; i < G[top].size(); i++){
            vecin = G[top][i];
            if(viz[vecin] == 0 && flow[top][vecin] < C[top][vecin]){
                viz[vecin]=1;
                if(vecin != n) Q.push(vecin);
                tata[vecin] = top;
            }
        }
    }
    return viz[n];
}

int main(){
    int i,a,b,c,nod;
    fin>>n>>m;

    for(i = 1; i <= m; i++){
        fin>>a>>b>>c;
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b] = c;
    }

    while(bfs()){
        mincap = 1000005;
        nod = n;
        while(nod != 1){
            mincap = min(mincap, C[tata[nod]][nod] - flow[tata[nod]][nod]);
            nod=tata[nod];
        }
        nod = n;
        while(nod != 1){
            flow[tata[nod]][nod] += mincap;
            flow[nod][tata[nod]] -= mincap;
            nod = tata[nod];
        }
        maxflow += mincap;
    }
    fout<<maxflow<<'\n';
    return 0;
}