Pagini recente » Cod sursa (job #3250373) | Cod sursa (job #2778179) | Cod sursa (job #1779181) | Cod sursa (job #1978494) | Cod sursa (job #347405)
Cod sursa(job #347405)
#include<stdio.h>
#include<string.h>
struct Nod {
int val;
Nod *next;
};
int C[1030][1030];
int flux;
int c;
int F[1030][1030];
int n;
int fT;
int x;
int viz[1030];
int min;
int y;
int AuxEnd;
int Q[1030];
int A2;
int A1;
int Wh[1030];
int m;
Nod *a[1030];
void insert(Nod *&u, int P)
{
Nod *k = new Nod;
k -> val = P;
k -> next = u;
u = k;
}
void BF()
{
int cap = 1;
int end = 1;
Q[cap] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
Wh[n] = 0;
while (cap <= end)
{
for(Nod *it = a[Q[cap]]; it; it = it -> next)
if (!viz[it->val])
{
A1 = Q[cap];
A2 = it -> val;
if (C[A1][A2] - F[A1][A2] > 0)
{
Q[++end] = it -> val;
viz[it->val] = 1;
Wh[Q[end]] = Q[cap];
if (it -> val == n)
{
cap = end;
break;
}
}
}
cap++;
}
}
int FluxMax()
{
do
{
BF();
for(Nod *it = a[n]; it; it = it -> next)
{
if (!viz[it->val] || C[it -> val] - F[it -> val][n] <= 0) continue;
min = 0;
AuxEnd = n;
Wh[n] = it -> val;
for(min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];Wh[AuxEnd]; AuxEnd = Wh[AuxEnd])
if (min > C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd])
min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];
for(AuxEnd = it -> val; Wh[AuxEnd]; AuxEnd = Wh[AuxEnd])
{
F[Wh[AuxEnd]][AuxEnd] += min;
F[AuxEnd][Wh[AuxEnd]] -= min;
}
fT += min;
}
}
while (viz[n]);
return fT;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d %d %d",&x, &y, &c);
insert(a[x],y);
insert(a[y],x);
C[x][y] = c;
}
printf("%d\n",FluxMax());
}