Cod sursa(job #1247861)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 24 octombrie 2014 11:12:59
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 128
#define inf 1<<30
int cap[N][N] , flux[N][N];
int t[N];
int n,m,a,b,i,x,y,z;


bool bfs(int sursa,int destinatie){
    int Q[N+1];
    bool use[N];
    memset( use , 0 , sizeof(use) );
    memset( t   , 0 , sizeof(t  ) );
    Q[0] = sursa;
    use[sursa] = 1;
    int p=0 , q=0;
    int u;
    while( p <= q ){
        u = Q[p++];
        for(i=sursa; i <= destinatie; ++i){
            if( !use[i] )
                if( cap[u][i] - flux[u][i] > 0 ){
                    Q[++q] = i;
                    t[i] = u;
                    use[i] = true;

                }


        }
    }
    if( t[destinatie] ) return 1;
    return 0;
}

int edmond_karp(int sursa,int destinatie){
    int flow=0;
    int i,minn;
    while( bfs(sursa,destinatie) ){
        minn = inf ;
        for( i = destinatie; t[i] ; i = t[i] ){
            if( cap[ t[i] ][i] - flux[ t[i] ][i] < minn  )
                minn = cap[ t[i] ][i] - flux[ t[i] ][i]; }
        for(i=destinatie; i ; i = t[i]){
            flux[ t[i] ][i] +=minn;
            flux[i][ t[i] ] -=minn;
        }
        flow += minn;
    }
    return flow;
}


int main()
{
    freopen("maxflow.in" , "r" , stdin);
    freopen("maxflow.out", "w" , stdout);
    scanf("%d %d \n",&n,&m);
    for(i=1;i<=m;++i){
        scanf("%d %d %d\n",&x,&y,&z);
        cap[x][y] = z;
        cap[y][x] = z;
    }
    a = 1; b= n;
    printf("%d" ,edmond_karp(a,b) );


    return 0;
}