Pagini recente » Cod sursa (job #1432025) | Cod sursa (job #1431870) | Cod sursa (job #1432005) | Borderou de evaluare (job #238889) | Cod sursa (job #240567)
Cod sursa(job #240567)
#include<stdio.h>
struct Nod {
int x;
Nod *next;
};
int C[1002][1002];
int Q[1002];
int maxflow;
int viz[1002];
int cost;
int x;
int p[1002];
int y;
int n;
int ok;
Nod *a[1002];
int m;
int BF()
{
Q[1] = 1;
int l = 1;
int r = 1;
for(int i = 1; i <= n; i++)
{
viz[i] = 0;
p[i] = 0;
}
viz[1] = 1;
while (l <= r)
{
for(Nod *it = a[Q[l]]; it; it = it -> next)
if (!viz[it -> x])
if (C[Q[l]][it->x] > 0)
{
Q[++r] = it -> x;
p[it -> x] = Q[l];
if (it -> x == n) break;
}
if (Q[r] == n) break;
l++;
}
int min = 100011;
int i = n;
while (p[i])
{
if (min > C[p[i]][i]) min = C[p[i]][i];
i = p[i];
}
i = n;
while (p[i])
{
C[p[i]][i] -= min;
C[i][p[i]] += min;
i = p[i];
}
if (min == 100011) return 0;
return min;
}
void insert(Nod *&u, int v)
{
Nod *f = new Nod;
f -> x = v;
f -> next = u;
u = f;
}
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, &cost);
C[x][y] = cost;
insert(a[x],y);
insert(a[y],x);
}
while (!ok)
{
int now = BF();
if (now == 0) ok = 1;
maxflow += now;
}
printf("%d",maxflow);
return 0;
}