Pagini recente » Cod sursa (job #107987) | Cod sursa (job #1254098) | Cod sursa (job #2584791) | Cod sursa (job #509748) | Cod sursa (job #245868)
Cod sursa(job #245868)
#include <stdio.h>
struct nod {int x,c;nod *urm;};
struct cod {int x;cod *urm;};
nod *A[1001];
cod *que,*ultim;
int max,arb[1001],cap[1001][1001];
void add(int x)
{
cod *w;
w = new cod;
w->x = x;
w->urm = NULL;
if (que==NULL) que = w,ultim = que;
else ultim->urm = w,ultim = w;
}
void drum(int p)
{
if (p!=-1) {
if (max>cap[arb[p]][p]) max = cap[arb[p]][p];
drum(arb[p]);
}
cap[arb[p]][p] -= max;
}
void BFS()
{
nod *q;
cod *w;
while (que!=NULL)
{
q = A[que->x];
while (q!=NULL)
{
if (arb[q->x]==0) if (cap[que->x][q->x]) arb[q->x]=que->x,add(q->x);
q = q->urm;
}
w = que;
que = que->urm;
delete(w);
}
}
int main()
{
FILE *in = fopen("maxflow.in","r");
FILE *out = fopen("maxflow.out","w");
int n,i,x,y,c,m;
nod *urm;
fscanf(in,"%d %d",&n,&m);
for (i=1;i<=m;i++)
{
fscanf(in,"%d%d%d",&x,&y,&c);
cap[x][y]=c;
urm = new nod;
urm->x = y;
urm->c = c;
urm->urm = A[x];
A[x] = urm;
}
bool ok=1;
int S=0;
while (ok)
{
ok=0;
arb[1] = -1;
for (i=2;i<=n;i++) arb[i]=0;
add(1);
BFS();
if (arb[n])
{
ok=1;
max = 110001;
drum(n);
S= S+max;
}
}
fprintf(out,"%d ",S);
fclose(in);
fclose(out);
}