Cod sursa(job #2489031)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 7 noiembrie 2019 21:23:37
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n,m, f[1010],t[1010],c[1010][1010],flux[1010][1010];
int tata, minim=-1, sol=0, x, y,capicitate;
deque <int>qq;
vector <int> a[1010];

int bfs(){
    int checked=0;
   for(int i=1; i<=1000; i++){
        f[i]=0;

    }
    f[1]=1;
    qq.push_back(1);
    while(!qq.empty()){
        int curent=qq.front();
        qq.pop_front();
        for(int i=0;i<a[curent].size();i++){
            int vecin=a[curent][i];
            if(f[vecin]==0 && c[curent][vecin]>flux[curent][vecin]){
                t[vecin]=curent;
                f[vecin]=1;
                qq.push_back(vecin);
                if(vecin==n){
                    checked=1;
                }

            }
        }
        qq.pop_front();

    }
    return checked;


}



int main(){

    fin>>n>>m;

    for(int i=1; i<=m; i++){
        fin>>x>>y>>capicitate;
        a[x].push_back(y);
        a[y].push_back(x);
        c[x][y]=capicitate;

    }

    while(bfs()){
        for(int i=0; i<a[n].size(); i++){
            int nod=a[n][i];
            if(c[nod][n]>flux[nod][n] && f[nod]==1){
                minim=c[nod][n]-flux[nod][n];
                tata=nod;
                while(t[tata]){
                    minim=min(minim, c[t[tata]][tata]-flux[t[tata]][tata]);
                    tata=t[tata];

                }
                sol+=minim;
                flux[nod][n]+=minim;
                flux[n][nod]-=minim;
                tata=nod;

                while(t[tata]){
                    flux[t[tata]][tata]+=minim;
                    flux[tata][t[tata]]-=minim;
                    tata=t[tata];

                }

            }

        }

    }

    fout<<sol;

}