Pagini recente » Cod sursa (job #353586) | Cod sursa (job #227327) | Cod sursa (job #1576965) | Cod sursa (job #449895) | Cod sursa (job #2808936)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1005;
vector<int> gr[N];
int cap[N][N], tata[N];
bool viz[N];
int n, m;
void cleanup() {
memset(viz, 0, (n + 1) * sizeof(bool));
memset(tata, 0, (n + 1) * sizeof(int));
}
bool bfs() {
queue<int> q;
q.push(1);
viz[1] = true;
while (!q.empty()) {
auto nod = q.front();
q.pop();
for (auto vec : gr[nod]) {
if (viz[vec]) continue;
if (cap[nod][vec] == 0) continue;
viz[vec] = true;
q.push(vec);
tata[vec] = nod;
}
}
return viz[n];
}
void adjust_flow() {
for (auto leaf : gr[n]) {
if (!viz[leaf]) continue;
int min_flow = cap[leaf][n];
int nod = leaf;
while (tata[nod]) {
min_flow = min(min_flow, cap[tata[nod]][nod]);
nod = tata[nod];
}
cap[leaf][n] -= min_flow;
cap[n][leaf] += min_flow;
nod = leaf;
while (tata[nod]) {
cap[tata[nod]][nod] -= min_flow;
cap[nod][tata[nod]] += min_flow;
nod = tata[nod];
}
}
}
int main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin >> n >> m;
while (m--) {
int x, y;
cin >> x >> y;
cin >> cap[x][y];
gr[x].push_back(y);
gr[y].push_back(x);
}
cin.close();
while (bfs()) {
adjust_flow();
cleanup();
}
int ans = 0;
for (auto nod : gr[1])
ans += cap[nod][1];
cout << ans << "\n";
cout.close();
return 0;
}