Cod sursa(job #2739097)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 6 aprilie 2021 20:12:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 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;
    memset(viz,0,sizeof(viz));
    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()){
        for(i = 0; i < G[n].size(); i++){
            mincap = 1000005;
            if(!viz[G[n][i]]) continue;
            tata[n] = G[n][i];
            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;
}