Pagini recente » Istoria paginii runda/oji_2004_10 | %round_id% | Cod sursa (job #1277366) | Statistici Valentin Maria (Coconut37) | Cod sursa (job #286069)
Cod sursa(job #286069)
#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[1001],T[1001],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);
}