Cod sursa(job #2735484)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 2 aprilie 2021 14:24:44
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>
using namespace std;
#define SERVER 0
const string nameFile="maxflow";
ifstream in (nameFile+".in");
ofstream out(nameFile+".out");
typedef pair<int, int> Pii;
#if (SERVER)
    #define in cin
    #define out cout
#endif
const int nmax=1e3;
const int oo=1e9;
int n, m, x, y, z;
vector <int> muchii[nmax+2];
int parent[nmax+2];
int capacity[nmax+2][nmax+2];
int ffLow;
int source=1, sink;
bool bfs(){
    bool ok=false;
    fill(parent+1, parent+n+1, -1);
    parent[source]=-2;
    queue <Pii> q;
    q.push({source, oo});
    while(!q.empty()){
        Pii per=q.front();
        q.pop();
        int nod=per.first;
        for(auto &x:muchii[nod])
            if(parent[x]==-1&&capacity[nod][x]){
                parent[x]=nod;
                int newFlow=min(per.second, capacity[nod][x]);
                if(x==sink)
                    ok=true;
                else
                    q.push({x, newFlow});
            }
    }
    return ok;
}
void flow(){
    while(bfs()){
        for(auto &x:muchii[sink]){
            if(parent[x]!=-1&&capacity[x][sink]){
                int flowTemp=capacity[x][sink];
                int nodAct=x;
                while(nodAct!=source&&flowTemp!=0){
                    flowTemp=min(flowTemp, capacity[parent[nodAct]][nodAct]);
                    nodAct=parent[nodAct];
                }
                if(flowTemp==0)
                    continue;
                ffLow+=flowTemp;
                capacity[x][sink]-=flowTemp;
                capacity[sink][x]+=flowTemp;
                nodAct=x;
                while(nodAct!=source){
                    capacity[parent[nodAct]][nodAct]-=flowTemp;
                    capacity[nodAct][parent[nodAct]]+=flowTemp;
                    nodAct=parent[nodAct];
                }
            }
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    in>>n>>m;
    sink=n;
    for(int i=1; i<=m; i++){
        in>>x>>y>>z;
        muchii[x].push_back(y);
        muchii[y].push_back(x);
        capacity[x][y]=z;
    }
    flow();
    out<<ffLow<<"\n";
    return 0;
}