Cod sursa(job #2469626)

Utilizator canmihaiCancescu Mihai canmihai Data 7 octombrie 2019 19:46:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
// o facusem dar aveam dimul prea mic
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#include <queue>
#define DIM 5010
using namespace std;
vector<int> v[DIM];
queue<int> coada;
int n,m,x,y,z,minim,flux,nod,p,u,cap[DIM][DIM],sursa[DIM],a[DIM],v2[DIM][DIM],g;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int bfs(){
    g=0;
    memset(a,0,DIM);
    a[1]=1;
    coada.push(1);
    while (!coada.empty()){
        nod=coada.front();
        for (int i=0;i<v[nod].size();i++){
            int vecin=v[nod][i];
            if (!a[vecin]&&cap[nod][vecin]>v2[nod][vecin]){
                coada.push(vecin);
                sursa[vecin]=nod;
                a[vecin]=1;
                if(vecin==n)
                    g=1;
            }
        }
        coada.pop();

    }
    return g;
}

int main (){
    fin>>n>>m;
    for (int i=1;i<=m;i++){
        fin>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y]=z;
    }
    while (bfs()){
        for (int i=0;i<v[n].size();i++){
            p=v[n][i];
            if(cap[p][n]>v2[p][n]&&a[p]){
                minim=cap[p][n]-v2[p][n];
                u=p;
                while(sursa[u]!=0){
                    minim=min(minim,cap[sursa[u]][u]-v2[sursa[u]][u]);
                    u=sursa[u];
                }
                flux+=minim;
                v2[p][n]+=minim,v2[n][p]-=minim;
                u=p;
                while(sursa[u]!=0){
                    v2[sursa[u]][u]+=minim,v2[u][sursa[u]]-=minim;
                    u=sursa[u];
                }

            }

        }

    }
    fout<<flux;

}