Cod sursa(job #420210)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 18 martie 2010 17:40:07
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<cstdio>
#include<vector>
#define MAX 1004
#define pb push_back
#define INFI 1000000000
using namespace std;

int cap[MAX][MAX],fluxmax,n, t[MAX];

void citire()
{
    int m,i;
    ifstream fin("maxflow.in");
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        cap[x][y]=z;
    }
}

int bfs(int start, int end)
{
    int st,dr,j,k,gata=0;
    vector<int> coada;
    coada.pb(start);
    st=dr=0;
    for(j=1;j<=n;j++)
        t[j]=-1;
    t[start]=0;
    while(st<=dr && !gata)
    {
        k=coada[st++];
        for(j=1;j<=n;j++)
            if(t[j]==-1 && cap[k][j])
            {
                coada.pb(j);
                dr++;
                t[j]=k;
                if(j==end)
                    gata=1;
            }
    }
    coada.clear();
    return gata;
}

void edm_karp()
{
    int cmin,v,k;
    while(bfs(1,n))
    {
        cmin=INFI;
        for(k=n, v=t[n] ; t[k]; k=t[k], v=t[v])
            if(cap[v][k]<cmin)
                cmin=cap[v][k];
        fluxmax+=cmin;
        for(k=n, v=t[n] ; t[k]; k=t[k], v=t[v])
        {
            cap[v][k]-=cmin;
            cap[k][v]+=cmin;
        }
    }
}

int main()
{
    freopen("maxflow.out","w",stdout);
    citire();
    edm_karp();
    printf("%d", fluxmax);
    return 0;
}