Pagini recente » Cod sursa (job #2856923) | Cod sursa (job #1195363) | Cod sursa (job #323147) | Cod sursa (job #465154) | Cod sursa (job #2696303)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define NMax 10005
int n, m, x, y, C, capacitate[NMax][NMax], flx[NMax][NMax], flux, viz[NMax], t[NMax];
vector <int> G[NMax];
int bfs()
{
for (int i = 0; i <= n; i++)
viz[i] = 0;
viz[1] = 1;
queue <int> coada;
int u;
viz[1] = 1;
coada.push(1);
while (!coada.empty())
{
u = coada.front();
coada.pop();
for (int i = 0; i < G[u].size(); i++)
if (!viz[G[u][i]] && capacitate[u][G[u][i]] != flx[u][G[u][i]])
{
viz[G[u][i]] = 1;
if (G[u][i] != n)
{
t[G[u][i]] = u;
coada.push(G[u][i]);
}
}
}
if (!viz[n])
return 0;
for (int i = 0; i < G[n].size(); i++)
{
t[n] = G[n][i];
if (viz[t[n]] && capacitate[t[n]][n] != flx[t[n]][n])
{
int fmin = 1e9;
for (u = n; u != 1; u = t[u])
fmin = min(fmin, capacitate[t[u]][u] - flx[t[u]][u]);
flux += fmin;
for (u = n; u != 1; u = t[u])
{
flx[t[u]][u] += fmin;
flx[u][t[u]] -= fmin;
}
}
}
return 1;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
fin >> x >> y >> C;
capacitate[x][y] = C;
G[x].push_back(y);
G[y].push_back(x);
}
while (bfs());
fout << flux;
return 0;
}