Pagini recente » Cod sursa (job #2069849) | Cod sursa (job #2125485) | Cod sursa (job #3351403) | Cod sursa (job #374126) | Cod sursa (job #3332036)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <queue>
#include <stack>
using namespace std;
#define pii pair<int, int>
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const char nl = '\n';
const int NMAX = 1001;
vector<int> g[NMAX];
int flow[NMAX][NMAX], cap[NMAX][NMAX], parent[NMAX], r[NMAX][NMAX];
int flux (int source, int dest) {
fill(parent, parent + NMAX, -1);
queue<int> q;
q.push(source);
parent[source] = source;
while (!q.empty()) {
int nod = q.front();
q.pop();
if (nod == dest) {
return 1;
}
for (auto neigh: g[nod]) {
if (cap[nod][neigh] - flow[nod][neigh] > 0 && parent[neigh] == -1) {
parent[neigh] = nod;
q.push(neigh);
}
}
}
return 0;
}
int main () {
int n,m;
fin >> n >> m;
for (int i = 0; i < m; i++) {
int x,y,z;
fin >> x >> y >> z;
g[x].push_back(y);
g[y].push_back(x);
cap[x][y] = z;
}
int max_flow = 0;
while (flux(1,n)) {
int nod = n;
int min = cap[parent[nod]][nod] - flow[parent[nod]][nod];
nod = parent[nod];
while (nod != 1) {
if (cap[parent[nod]][nod] - flow[parent[nod]][nod] < min) {
min = cap[parent[nod]][nod] - flow[parent[nod]][nod];
}
nod = parent[nod];
}
nod = n;
while (nod != 1) {
flow[parent[nod]][nod] += min;
flow[nod][parent[nod]] -= min;
nod = parent[nod];
}
max_flow += min;
}
fout << max_flow;
}