Cod sursa(job #1384567)

Utilizator turbowin120Amarandei-Stanescu Alexandru turbowin120 Data 11 martie 2015 10:48:46
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 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);

    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);


}

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

    for(int i=0;i<=N;i++) ver[i]=0;
    ver[1]=true;

    while(st<=dr){
        x=coada[st];
        p=lst[x];
        st++;
        if(x!=n){
        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 nu are debit maxim
                ver[y]=1;
                padre[y]=x;
                coada[++dr]=y;

        }
        }
    }

    return ver[n];


}


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[y][n]==intors[y][n]||!ver[y]) continue;//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;
}