Cod sursa(job #1384156)

Utilizator turbowin120Amarandei-Stanescu Alexandru turbowin120 Data 10 martie 2015 21:59:04
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <climits>
#include <stdio.h>
using namespace std;
const int N=1003, M=5005;
short vf[M],urm[M],lst[N],cost[M];
int n,m,nr;
int padre[N],coada[M+M],dus[N][N],intors[N][N]; //vector de tati, coada, cost: dus, intors
bool ver[N];

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, int c){
    nr++;
    vf[nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
    cost[nr]=c;

}



void citire(){
    FILE *in;
    in=fopen("maxflow.in","r");
    fscanf(in,"%d%d",&n,&m);
    int a,b,c;
    for(int i=1;i<=m;i++){
        fscanf(in,"%d%d%d",&a,&b,&c);
        dus[a][b]+=c;
        adauga(a,b,c);
        adauga(b,a,c);

    }
    fclose(in);


}

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

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

    while(st<=dr){
        x=coada[st];
        p=lst[x];
        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;
                if(y==n) return 1;


        }

        st++;
    }
    return 0;


}


void rez(){
    int rez=0,rmin;
    while(bfs()){

        rmin=INT_MAX;
        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
        for(int i=n;i!=1;i=padre[i]){
            intors[padre[i]][i]+=rmin; //si o adaug
            intors[i][padre[i]]-=rmin;// si dupa o scad (logic)

        }
        rez+=rmin;
    }
    afisare(rez);


}

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

    return 0;
}