Pagini recente » Cod sursa (job #102557) | Cod sursa (job #2784544) | Cod sursa (job #223763) | Cod sursa (job #704089) | Cod sursa (job #2017716)
#include <bits/stdc++.h>
using namespace std;
FILE *f1 = fopen("maxflow.in", "r");
FILE *f2 = fopen("maxflow.out", "w");
int capacity[1001][1001], flow[1001][1001], n, m, mflow, v[1001], i, a, b, nr, coada[1001], mins, father[1001];
vector<int>G[1001];
int Edmonds_Karp()
{
memset(v, 0, sizeof(v));
nr = 0;
mins = 1000000000;
int p, u, i, sw = 1, j;
p = u = 1;
coada[p] = 1;
v[1] = 1;
while (p <= u)
{
nr = coada[p];
for (i = 0; i < G[nr].size(); i++)
if (v[G[nr][i]] == 0 && capacity[nr][G[nr][i]] - flow[nr][G[nr][i]] > 0)
{
v[G[nr][i]] = 1;
father[G[nr][i]] = nr;
if (G[nr][i] != n)
{
u++;
coada[u] = G[nr][i];
}
}
p++;
}
if (v[n] == 0)
return 0;
for (j = 0; j < G[n].size(); j++)
if (v[G[n][j]] == 1 && capacity[G[n][j]][n] - flow[G[n][j]][n] > 0)
{
father[n] = G[n][j];
mins = 1000000000;
i = n;
while (i != 1)
{
sw = father[i];
if (mins > capacity[sw][i] - flow[sw][i])
mins = capacity[sw][i] - flow[sw][i];
i = sw;
}
mflow = mflow + mins;
i = n;
while (i != 1)
{
sw = father[i];
flow[sw][i] += mins;
flow[i][sw] = -flow[sw][i];
i = sw;
}
}
return 1;
}
int main()
{
fscanf(f1, "%d%d", &n, &m);
for (i = 1; i <= m; i++)
{
fscanf(f1, "%d%d%d", &a, &b, &nr);
capacity[a][b] = nr;
G[a].push_back(b);
G[b].push_back(a);
}
a = 1;
while(a == 1)
{
a = Edmonds_Karp();
}
fprintf(f2, "%d\n", mflow);
return 0;
}