Cod sursa(job #1384524)

Utilizator turbowin120Amarandei-Stanescu Alexandru turbowin120 Data 11 martie 2015 10:17:11
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <climits>
#include <stdio.h>
using namespace std;
const int N=1005, M=10005;
int vf[M],urm[M],lst[N];
int n,m,nr;
long long padre[N],coada[M],dus[N][N],intors[N][N]; //vector de tati, coada, cost: dus, intors
bool ver[N+N];
int a,b,c,v=-1;

void afisare(int x){
    FILE *out;
    out=fopen("maxflow.out","w");
    fprintf(out,"%d",x);
    fclose(out);

}

inline int minim(int x, int y) {
    if(x>y) return y;
    else return x;
}


inline void adauga(int x, int y){
    nr++;
    vf[nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}

void citire(){
    FILE *in;
    in=fopen("maxflow.in","r");
    fscanf(in,"%d%d",&n,&m);

    int m2=m;
    for(int i=1;i<=m;i++){

        fscanf(in,"%d%d%d",&a,&b,&c);



        dus[a][b]+=c;

        adauga(a,b);
        adauga(b,a);

    }

    fclose(in);


}

int bfs(){
    int p,x,y,st,dr;
    dr=0; st=1;
    coada[++dr]=1;


    ver[1]=true;

    while(st<=dr){
        x=coada[st];
        p=lst[x];

        if(x==n) return 1; //dc gasesc un drum returnez 1
        while(p!=0){
            y=vf[p];
            p=urm[p];
            if(ver[y]==1 ||dus[x][y]==intors[x][y]) continue;//adaug in coada doar dc nu am mai ajuns in nod sau dc respecta legea lui ohm
                ver[y]=1;
                padre[y]=x;
                coada[++dr]=y;



        }

        st++;
    }
    return 0;


}


void rez(){
    int rez=0,rmin,p,y;
    while(bfs()){//cat timp gasesc drumuri posibile
        p=lst[n];//iau lista lui n

        while(p!=0){
            y=vf[p];
            p=urm[p];
            if(dus[n][y]!=intors[n][y]||ver[y]!=0){ //o verific
                rmin=INT_MAX;
                padre[n]=y;
                for(int i=n;i!=1;i=padre[i]) {rmin=minim(rmin, dus[padre[i]][i]-intors[padre[i]][i] ); }//gasesc muchia de lungime minima in graf
                if(rmin!=0){
                    for(int i=n;i!=1;i=padre[i]){
                        intors[padre[i]][i]+=rmin; //si o adaug la intors
                        intors[i][padre[i]]-=rmin;// si dupa o scad la debit(logic)

                    }
                    rez+=rmin; //apoi adaug noul debit la rezultat
                    p=urm[p];
                }
            }
        }
    }
    afisare(rez);


}

int main()
{
    citire();
    rez();

    return 0;
}