Pagini recente » Cod sursa (job #1849665) | Cod sursa (job #588166) | Cod sursa (job #2697357) | Cod sursa (job #2432998) | Cod sursa (job #347352)
Cod sursa(job #347352)
#include<stdio.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 y;
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;
}
int 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 AuxEnd = n;
int min = 0;
if (Wh[AuxEnd])
min = C[Wh[AuxEnd]][AuxEnd] - F[Wh[AuxEnd]][AuxEnd];
while (Wh[AuxEnd])
{
A2 = AuxEnd;
A1 = Wh[A2];
if (min > C[A1][A2] - F[A1][A2]) min = C[A1][A2] - F[A1][A2];
AuxEnd = Wh[AuxEnd];
}
AuxEnd = n;
while (Wh[AuxEnd] != 0)
{
F[Wh[AuxEnd]][AuxEnd] += min;
F[AuxEnd][Wh[AuxEnd]] -= min;
AuxEnd = Wh[AuxEnd];
}
//if (min == MAX) min = 0;
return min;
}
int FluxMax()
{
do
{
flux = BF();
fT += flux;
}
while (flux);
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());
}