Cod sursa(job #2380244)

Utilizator SweetHumanAvram Gheorghe SweetHuman Data 14 martie 2019 18:25:25
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
ifstream f1("maxflow.in");
ofstream f2("maxflow.out");

int capacity[1005][1005], flowPipe[1005][1005], parent[1005];
vector<int> leg[1005];
bitset<1005> viz;
queue<int> q;
int n,m;

void citire(){
    int x,y,z;
    f1>>n>>m;
    for(int i=0;i<m;i++){
        f1>>x>>y>>z;
        leg[x].push_back(y);
        leg[y].push_back(x);
        capacity[x][y]=z;
    }
}

int bfs(){
    q.push(1);
    viz.reset();
    viz[1]=true;
    int nod;
    while(!q.empty()){
        nod=q.front();
        q.pop();
        if(nod==n) break;
        for(int &vecin:leg[nod]){
            if(!viz[vecin] && capacity[nod][vecin]!=flowPipe[nod][vecin]){
                parent[vecin]=nod;
                viz[vecin]=true;
                q.push(vecin);
            }
        }
    }
    while(!q.empty())
        q.pop();
    return viz[n];
}

void edmonKartagio(){
    int flow = 0;
    while(bfs()){
        int min_flow = INT_MAX;
        for(int nod=n;nod!=1;nod=parent[nod]){
            min_flow = min(min_flow, capacity[parent[nod]][nod]-flowPipe[parent[nod]][nod]);
        }
        for(int nod=n;nod!=1;nod=parent[nod]){
            flowPipe[parent[nod]][nod]+=min_flow;
            flowPipe[nod][parent[nod]]-=min_flow;
        }
        flow +=min_flow;
    }
    f2<<flow;
}

int main() {
    citire();
    edmonKartagio();
    return 0;
}