Pagini recente » Cod sursa (job #3216965) | Cod sursa (job #1027954) | Cod sursa (job #442888) | Cod sursa (job #1355660) | Cod sursa (job #2209781)
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1001
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int a[nmax][nmax];
bool bfs(int residualA[nmax][nmax], int s, int t, int p[], int n)
{
bool viz[nmax];
int i,v;
for (i = 1; i <= n; ++i)
viz[i] = false;
queue<int> coada;
coada.push(s);
viz[s] = true;
p[s] = -1;
while (coada.size())
{
int u = coada.front();
coada.pop();
for(v=1; v<=n; ++v)
if (viz[v] == false && residualA[u][v] > 0)
{
coada.push(v);
p[v] = u;
viz[v] = true;
}
}
return (viz[t] == true);
}
int e_kp(int a[nmax][nmax], int s, int t, int n)
{
int u, v;
int residualA[nmax][nmax];
for (u = 1; u <= n; ++u)
for (v = 1; v <= n; ++v)
residualA[u][v] = a[u][v];
int p[nmax];
int flux_maxim = 0;
while (bfs(residualA, s, t, p,n))
{
int cale_r = 99999;
for (v = t; v != s; v = p[v])
{
u = p[v];
cale_r = min(cale_r, residualA[u][v]);
}
// update residual capacities
for (v = t; v != s; v = p[v])
{
u = p[v];
residualA[u][v] -= cale_r;
residualA[v][u] += cale_r;
}
flux_maxim += cale_r;
}
return flux_maxim;
}
int main()
{
int i, n, m, c, x, y;
fin >> n >> m;
for (i = 1; i <= m; ++i)
{
fin >> x >> y >> c;
a[x][y] = c;
}
int fluxMaxim = e_kp(a, 1, n, n);
fout << fluxMaxim << "\n";
return 0;
}