Pagini recente » Monitorul de evaluare | Cod sursa (job #1761114) | Cod sursa (job #863614) | Cod sursa (job #1283076) | Cod sursa (job #2017590)
#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 = 10000000;
int p, u, i, sw = 1;
p = u = 1;
coada[p] = 1;
v[1] = 1;
while (p <= u && sw == 1)
{
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)
{
u++;
v[G[nr][i]] = 1;
coada[u] = G[nr][i];
father[G[nr][i]] = nr;
if (G[nr][i] == n)
{
sw = 0;
break;
}
}
p++;
}
if (v[n] == 0)
return 0;
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);
}
a = 1;
while(a == 1)
{
a = Edmonds_Karp();
}
fprintf(f2, "%d\n", mflow);
return 0;
}