Pagini recente » Cod sursa (job #957428) | Borderou de evaluare (job #1569192) | Cod sursa (job #351311) | Cod sursa (job #3215380) | Cod sursa (job #2218027)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define MAXN 100
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector < int > v[MAXN + 1];
int cap[MAXN + 1][MAXN + 1], flow[MAXN + 1][MAXN + 1], seen[MAXN + 1], father[MAXN + 1];
queue < int > Q;
inline int bfs(int s, int d)
{
memset(seen, 0, sizeof seen);
seen[s] = 1;
Q.push(s);
while (Q.empty() == false)
{
int node = Q.front();
Q.pop();
if (node != d)
for (auto it : v[node])
if (seen[it] == 0 && flow[node][it] < cap[node][it])
{
seen[it] = 1;
Q.push(it);
father[it] = node;
}
}
return seen[d];
}
int main()
{
int n, m;
f >> n >> m;
for (int i = 0; i < m; i ++ )
{
int x, y, z;
f >> x >> y >> z;
cap[x][y] += z;
v[x].push_back(y);
v[y].push_back(x);
}
int maxflow = 0;
while ( bfs(1, n) )
for (auto it : v[n])
if (seen[it] && flow[it][n] < cap[it][n])
{
father[n] = it;
int fl = INF;
for (int node = n; node != 1; node = father[node])
fl = min(fl, cap[father[node]][node] - flow[father[node]][node]);
for (int node = n; node != 1; node = father[node])
{
flow[father[node]][node] += fl;
flow[node][father[node]] -= fl;
}
maxflow += fl;
}
g << maxflow ;
return 0;
}