Pagini recente » Cod sursa (job #2939220) | Monitorul de evaluare | Cod sursa (job #1847010) | Cod sursa (job #1978498) | Cod sursa (job #347248)
Cod sursa(job #347248)
#include<stdio.h>
#define MAX 555000000
struct Nod {
int val;
Nod *next;
};
int C[1002][1002];
int flux;
int c;
int F[1002][1002];
int n;
int fT;
int x;
int viz[1010];
int y;
int Q[1010];
int Wh[1010];
int m;
Nod *a[1002];
void insert(Nod *&u, int P)
{
Nod *k = new Nod;
k -> val = P;
k -> next = u;
u = k;
}
void InitViz()
{
for(int i = 1; i <= n; i++)
viz[i] = 0;
viz[1] = 1;
}
int BF()
{
int cap = 1;
int end = 1;
Q[cap] = 1;
InitViz();
while (cap <= end)
{
for(Nod *it = a[Q[cap]]; it; it = it -> next)
if (C[Q[cap]][it -> val] - F[Q[cap]][it -> val] > 0)
if (!viz[it->val])
{
Q[++end] = it -> val;
viz[it->val] = 1;
Wh[end] = cap;
if (it -> val == n)
{
cap = end;
break;
}
}
cap++;
}
int min = MAX;
if (Q[end] == n)
{
int AuxEnd = end;
while (Wh[AuxEnd] != 0)
{
if (min > C[Q[Wh[AuxEnd]]][Q[AuxEnd]] - F[Q[Wh[AuxEnd]]][Q[AuxEnd]])
min = C[Q[Wh[AuxEnd]]][Q[AuxEnd]] - F[Q[Wh[AuxEnd]]][Q[AuxEnd]];
AuxEnd = Wh[AuxEnd];
}
AuxEnd = end;
while (Wh[AuxEnd] != 0)
{
F[Q[Wh[AuxEnd]]][Q[AuxEnd]] += min;
F[Q[AuxEnd]][Q[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());
}