Cod sursa(job #2886890)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 8 aprilie 2022 16:00:33
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1005;

///ne vom folosi de notiunea de graf rezidual, adica graful retelei de transport
///in care pentru fiecare muchie introducem si muchia inversa, cu capacitate 0
///la fiecare pas trebuie sa gasim in acest graf un drum de la sursa
///la destinatie, in care fiecare muchie de pe drum sa aiba fluxul asociat pana
///in acest moment strict mai mic decat capacitatea sa
int N, M, cap[NMAX][NMAX], flow[NMAX][NMAX], P[NMAX];
vector<int> g[NMAX];
bool viz[NMAX];
queue<int> q;

bool BFS(){
    while(!q.empty())
        q.pop();
    for(int i=1;i<=N;i++)
        viz[i]=false;
    q.push(1);
    viz[1]=true;
    int nod;
    while(!q.empty()){
        nod=q.front();
        q.pop();
        if(nod==N)
            continue;
        for(auto x: g[nod]){
            if(flow[nod][x]==cap[nod][x] or viz[x]==true)
                continue;
            viz[x]=true;
            q.push(x);
            P[x]=nod;
        }
    }

    return viz[N]==true;
}

int main()
{
    fin>>N>>M;
    int x, y, z;
    for(int i=1;i<=M;i++){
        fin>>x>>y>>z;
        g[x].push_back(y);
        g[y].push_back(x);
        cap[x][y]=z;
    }

    int flow_total=0;
    while(BFS()){
        int fmin=INT_MAX;
        for(int i=N;i!=1;i=P[i]){
            fmin=min(fmin,cap[P[i]][i]-flow[P[i]][i]);
        }
        for(int i=N;i!=1;i=P[i]){
            flow[P[i]][i]+=fmin;
            flow[i][P[i]]-=fmin;
        }
        flow_total+=fmin;
    }

    fout<<flow_total;

    fin.close();
    fout.close();
    return 0;

}