Cod sursa(job #983620)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 12 august 2013 13:41:22
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
using namespace std;
int m,n,l,c,ax,mx,i;
int v[1024][1024];
struct arbore
{
    int flux,ant;
} arb[1024];
void construct()
{
    int st[1024],b[1024],nst,pos,i,ax;
    for (i=0;i<1024;i++)
        arb[i].flux=arb[i].ant=st[i]=b[i]=0;
    arb[1].flux=999999999;
    st[1]=1;
    nst=1;
    pos=1;
    b[1]=1;
    while (st[pos]!=0)
    {
        for (i=2;i<n;i++)
            if ((v[st[pos]][i]!=0)&&(b[i]==0))
            {
                nst++;
                st[nst]=i;
                b[i]=1;
                ax=arb[i].flux;
                arb[i].flux=max(arb[i].flux,min(v[st[pos]][i],arb[st[pos]].flux));
                if (arb[i].flux!=ax)
                    arb[i].ant=st[pos];
            }
        pos++;
    }
}
int go()
{
    int val,mn,pos,i;
    val=0;
    for (i=1;i<n;i++)
        if (v[i][n]!=0)
        {
            mn=v[i][n];
            pos=i;
            while (pos>1)
            {
                if (arb[pos].flux<mn)
                    mn=arb[pos].flux;
                pos=arb[pos].ant;
            }
            if (pos==0)
                mn=0;
            val+=mn;
            v[i][n]-=mn;
            v[n][i]+=mn;
            pos=i;
            while (pos>1)
            {
                v[arb[pos].ant][pos]-=mn;
                v[pos][arb[pos].ant]+=mn;
                arb[pos].flux-=mn;
                pos=arb[pos].ant;
            }
        }
    return val;
}
int main(void)
{
    FILE * f;
    f=fopen("maxflow.in","r");
    ofstream g("maxflow.out");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&l,&c);
        fscanf(f,"%d",&v[l][c]);
    }
    construct();
    ax=go();
    while (ax!=0)
    {
        mx+=ax;
        construct();
        ax=go();
    }
    g<<mx;
    g.close();
    return 0;
}