Pagini recente » Cod sursa (job #641592) | Cod sursa (job #2167223) | Cod sursa (job #728071) | Cod sursa (job #561697) | Cod sursa (job #1956437)
#include <fstream>
#include <vector>
#define NMAX 1010
#define INF 110010
using namespace std;
FILE *fin, *fout;
int n, m, viz[NMAX], sursa, dest, ic, sc, C[NMAX], F[NMAX][NMAX], cap[NMAX][NMAX];
vector<int> A[NMAX], B[NMAX];
int main()
{
int i, x, y, z, acum, urm, v1, v2, v, sol;
fin = fopen("maxflow.in", "r");
fout = fopen("maxflow.out", "w");
fscanf(fin, "%d%d", &n, &m);
for (i = 1; i <= m; i++)
{
fscanf(fin, "%d%d%d", &x, &y, &z);
A[x].push_back(y);
B[y].push_back(x);
cap[x][y] = z;
}
for (i = 1; i <= n; i++)
{
if (!A[i].size())
dest = i;
else if (!B[i].size())
sursa = i;
}
while (true)
{
viz[sursa] = NMAX;
ic = sc = 0;
C[sc] = sursa;
while (ic <= sc && !viz[dest])
{
acum = C[ic++];
for (i = 0; i < A[acum].size(); i++)
{
urm = A[acum][i];
if (!viz[urm] && F[acum][urm] < cap[acum][urm])
{
viz[urm] = acum;
C[++sc] = urm;
}
}
for (i = 0; i < B[acum].size(); i++)
{
urm = B[acum][i];
if (!viz[urm] && F[urm][acum] > 0)
{
viz[urm] = -acum;
C[++sc] = acum;
}
}
}
if (!viz[dest])
break;
v1 = v2 = INF;
for (i = dest; viz[i] != NMAX; )
{
if (viz[i] > 0)
{
v1 = min(v1, cap[viz[i]][i] - F[viz[i]][i]);
i = viz[i];
}
else
{
v2 = min(v2, F[i][-viz[i]]);
i = -viz[i];
}
}
v = min(v1, v2);
for (i = dest; viz[i] != NMAX; )
{
if (viz[i] > 0)
{
F[viz[i]][i] += v;
i = viz[i];
}
else
{
F[i][-viz[i]] -= v;
i = -viz[i];
}
}
for (i = 1; i <= n; i++)
viz[i] = 0;
}
sol = 0;
for (i = 0; i < A[sursa].size(); i++)
sol += F[sursa][A[sursa][i]];
fprintf(fout, "%d\n", sol);
fclose(fout);
return 0;
}