Cod sursa(job #407460)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 2 martie 2010 12:53:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
//flux maxim
#include <stdio.h>
#define size 1<<10
#define infinit 110011
#define min(a,b) a<b?a:b

using namespace std;

struct nod
{
    int inf;
    nod * next;
}*V[size];
int n,m,nr;
int C[size][size],F[size][size];
int Tati[size],sir[size];
int Flux;

void add(nod *&a,int i)
{
    nod *q=new nod;
    q->inf=i;
    q->next=a;
    a=q;
}

void citire()
{
    int a,b,c;
    scanf ("%d %d",&n,&m);
    for (int i=0;i<m;i++)
    {
        scanf ("%d %d %d",&a,&b,&c);
        C[a][b]=c;
        add(V[a],b);
        add(V[b],a);
    }
}

int verif()
{
    for (int i=2;i<=n;Tati[i++]=0);
    Tati[1]=-1;
    sir[(nr=0)++]=1;
    for (int i=0;i<nr;i++)
        for (nod *q=V[sir[i]];q;q=q->next)
        {
            if (Tati[q->inf] || C[sir[i]][q->inf]<=F[sir[i]][q->inf])
                continue;
            Tati[q->inf]=sir[i];
            sir[nr++]=q->inf;
            if (q->inf==n)
                return 1;
        }
    return 0;
}

void solve()
{
    int nod,fl;

    while (verif())
    {
        for (int i=1;i<=n;i++)
        {
            if (Tati[i]==0 || C[i][n]<=F[i][n])
                continue;
            nod=i;
            fl=C[i][n]-F[i][n];
            while (nod!=1)
            {
                fl=min(fl,C[Tati[nod]][nod]-F[Tati[nod]][nod]);
                nod=Tati[nod];
            }
            if (!fl)
                continue;
            Flux+=fl;
            F[i][n]+=fl;
            F[n][i]-=fl;
            nod=i;
            while (nod!=1)
            {
                F[nod][Tati[nod]]-=fl;
                F[Tati[nod]][nod]+=fl;
                nod=Tati[nod];
            }
        }
    }
    printf("%d\n", Flux);
}

int main ()
{
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    citire();
    solve();
    return 0;
}