Cod sursa(job #414976)

Utilizator al_flAlexandru Flavian al_fl Data 10 martie 2010 19:34:23
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
#include <vector>
#include <deque>

using namespace std;

const int Lg = 1005;
vector <int> V[Lg];
int Flux[Lg][Lg] ,Cap[Lg][Lg];
int n,m,viz[Lg],tati[Lg],st[Lg];

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);
        Cap[a][b]=c;
        V[a].push_back(b);
        V[b].push_back(a);
    }
}

bool df()
{
    for (int i=1;i<=n;i++)
        tati[i]=0;
    tati[1]=-1;
    st[1]=1;
    int nr=2;
    for (int i=1;i<nr;i++)
        for (int j=0;j<V[st[i]].size();j++)
        {
            if (tati[V[st[i]][j]] || Cap[st[i]][V[st[i]][j]]<=Flux[st[i]][V[st[i]][j]])
                continue;
            tati[V[st[i]][j]]=st[i];
            st[nr++]=V[st[i]][j];
            if (V[st[i]][j]==n)
                return true;
        }
    return false;
}

void solve()
{
    int flux=0;
    while (df()==true)
    {
        for (int i=1;i<=n;i++)
        {
            if (!tati[i] || Cap[i][n]<=Flux[i][n])
                continue;

            int fl=Cap[i][n]-Flux[i][n];
            int nod=i;

            while(nod!=1)
            {
                if (fl>Cap[tati[nod]][nod]-Flux[tati[nod]][nod])
                    fl=Cap[tati[nod]][nod]-Flux[tati[nod]][nod];
                nod=tati[nod];
            }
            if (!fl)
                continue;
            flux+=fl;
            Flux[i][n]+=fl;
            Flux[n][i]-=fl;
            nod=i;
            while (nod!=1)
            {
                Flux[tati[nod]][nod]+=fl;
                Flux[nod][tati[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;
}