Pagini recente » Cod sursa (job #63429) | Cod sursa (job #1395228) | Cod sursa (job #3172484) | Cod sursa (job #667134) | Cod sursa (job #2490670)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int varfuri, muchii, start, final, C[50][50], F[50][50], viz[50], L[50];
int main()
{
fin >> varfuri >> muchii;
start = 1;
final = varfuri;
for (int i = 1; i <= muchii; ++i)
{
int x, y, c;
fin >> x >> y >> c;
C[x][y] = c;
}
do
{
for (int i = 1; i <= varfuri; ++i)
viz[i] = 0;
queue<int> qu;
qu.push(start);
viz[start] = 1;
while (!(qu.empty() || viz[final]))
{
int elem = qu.front();
qu.pop();
for (int i = 1; i <= varfuri; ++i)
if (!viz[i])
{
if (F[elem][i] < C[elem][i])
{
viz[i] = elem;
qu.push(i);
}
else if (F[i][elem] > 0)
{
viz[i] = - elem;
qu.push(i);
}
}
}
if (!viz[final])
break;
L[0] = final;
int lant = 0, a, b, v;
a = b = 1 << 30;
while (L[lant] != start)
{
L[++lant] = abs(viz[L[lant-1]]);
if (viz[L[lant-1]] > 0)
a = min(a, C[L[lant]][L[lant-1]] - F[L[lant]][L[lant-1]]);
else if (viz[L[lant-1]] < 0)
b = min(b, F[L[lant-1]][L[lant]]);
}
v = min(a, b);
for (int i = lant; i >= 1; --i)
if (viz[L[i-1]] > 0)
F[L[i]][L[i-1]] += v;
else
F[L[i-1]][L[i]] -= v;
} while (1);
/*for (int i = 1; i <= varfuri; ++i)
for (int j = 1; j <= varfuri; ++j)
if (F[i][j])
fout << i << '-' << j << " : " << F[i][j] << '\n';*/
int fmax = 0;
for (int i = 1; i <= varfuri; ++i)
fmax += F[i][final];
fout << fmax;
}