Cod sursa(job #286261)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 23 martie 2009 17:06:05
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>

struct cod
{
int x;
cod *urm;
};
cod *que,*ultim;

void add(int x)
{
cod *urm = new cod;
urm->x = x;
urm->urm = NULL;
if (que==NULL) que=urm,ultim=que;
else ultim->urm = urm,ultim = urm;
}

struct nod
{
int x,o;
nod *urm;
};
nod *A[1001];
int Q[5001],E[5001],T[5001],flux,fx;
bool ok=1,ok2=1;

void drum(int x,int c)
{
if (x==1) ok=1;
if (x)
{
if (c<fx) fx = c;
drum(T[x],Q[E[x]]);
}
if (ok) Q[E[x]]-=fx;
}

void ad(int x,int y,int i)
{
nod *urm = new nod;
urm->x = y;
urm->o = i;
urm->urm = A[x];
A[x] = urm;
}

int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);

int n,m,x,y,c,i;
scanf("%d%d\n",&n,&m);
while (m)
{
scanf("%d%d%d\n",&x,&y,&c);
if (y==n) ad(y,x,m);
else ad(x,y,m);
Q[m]=c;
m--;
}
cod *w;
nod *q;

while (ok2)
{
ok2 = 0;
que = NULL;
add(1);
for (i=1;i<=n;i++) T[i] = 0,E[i] = 0;

while (que)
{
q = A[que->x];
while (q!=NULL)
{
if (!T[q->x])
        if (Q[q->o])
              {
              add(q->x);
              T[q->x] = que->x;
              E[q->x] = q->o;
              }
q = q->urm;
}
w = que;
que = que->urm;
delete (w);
}

q = A[n];

while (q)
{
ok = 0;
fx = Q[q->o];
drum(q->x,Q[q->o]);
if (ok)
if (fx) {
        flux += fx;
        Q[q->o] -=fx;
        ok2=1;
        }
q = q->urm;
}
}
//for (i=1;i<=n;i++) printf("%d ",E[i]);
printf("%d",flux);
}