Cod sursa(job #2444060)

Utilizator Leonard123Mirt Leonard Leonard123 Data 30 iulie 2019 10:43:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 1005

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

vector <int> v[maxn];
int TT[maxn],viz[maxn],ant[maxn],f[maxn][maxn],cost[maxn][maxn],N,M,Flux,flux_minim;

void read(){
    cin>>N>>M;
    int x,y,c;
    for(int i=1; i<=M; i++){
        cin>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);
        cost[x][y]+=c;
    }
}

int bfs(){

    memset(viz,0,sizeof(viz));///marcheaza N elemente din viz cu valoarea 0
    ant[0]=ant[1]=viz[1]=1;
    int nod,dest;



    for(int i=1; i<=ant[0]; i++){
            nod=ant[i];
            if(nod==N)
                continue;


            for(int i=0; i<v[nod].size(); i++){
                dest=v[nod][i];
                if(viz[dest] || cost[nod][dest] == f[nod][dest])
                    continue;
                ant[++ant[0]]=dest;
                TT[dest]=nod;
                viz[dest]=1;
            }
        }

    return viz[N];
}


void solve(){
    int nod;
    for(Flux=0; bfs();)
        for(int i=0; i<v[N].size(); i++){
            nod=v[N][i];
            if(!viz[N] || cost[nod][N]==f[nod][N])
                continue;
            TT[N]=nod;
            flux_minim=1000000000;
           /// flux_minim=INT_MAX; maximul int (libraria climits)
            for(int wh=N; wh!=1; wh=TT[wh])
                flux_minim=min(flux_minim, cost[TT[wh]][wh]-f[TT[wh]][wh]);
            if(flux_minim==0)
                continue;
            for(int wh=N; wh!=1; wh=TT[wh]){
                f[TT[wh]][wh]+=flux_minim;
                f[wh][TT[wh]]-=flux_minim;
            }
            Flux+=flux_minim;
        }
    cout<<Flux;
}

int main(){
    read();
    solve();
}