Pagini recente » Cod sursa (job #2175454) | Cod sursa (job #2158401) | Cod sursa (job #2473686) | Cod sursa (job #277133) | Cod sursa (job #3041988)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#include <climits>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
const int INF = INT_MAX;
const int N = 1000;
int flux[N + 1][N + 1], tata[N + 1];
bool viz[N + 1];
vector <int> g[N + 1];
int n, m, x, y, cap;
bool bfs (int node, int fin)
{
queue <int> q;
memset (tata, 0, sizeof(tata));
memset (viz, 0, sizeof (viz));
q.push(node);
viz[node] = 1;
while (!q.empty())
{
int x = q.front();
q.pop();
for (auto it : g[x])
if (!viz[it] && flux[x][it] > 0)
{
viz[it] = 1;
if (it == fin)
{
tata[it] = x;
return 1;
}
tata[it] = x;
q.push(it);
}
}
return 0;
}
int ff (int start, int fin)
{
int maxflow = 0;
while (bfs (start, fin))
{
int mn = INF, dad;
for (int i = fin; i != start; i = tata[i])
dad = tata[i], mn = min (mn, flux[dad][i]);
for (int i = fin; i != start; i = tata[i])
{
dad = tata[i];
flux[dad][i] -= mn;
flux[i][dad] += mn;
}
maxflow += mn;
}
return maxflow;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m && cin >> x >> y >> cap; ++i)
{
g[x].push_back(y);
g[y].push_back(x);
flux[x][y] = cap;
}
cout << ff (1, n) << '\n';
return 0;
}