Pagini recente » Cod sursa (job #428035) | Cod sursa (job #3279824) | Cod sursa (job #268739) | Cod sursa (job #2390829) | Cod sursa (job #2921197)
#include <bits/stdc++.h>
const int NMAX = 1e3 + 5;
struct flowEdge {
int u, v, cap;
};
bool ok;
int n, m, flow, t[NMAX], ptr[NMAX], level[NMAX], pos[NMAX];
std :: vector < flowEdge > edges;
std :: vector < int > G[NMAX];
std :: ifstream fin("maxflow.in");
std :: ofstream fout("maxflow.out");
bool BFS(int node) {
std :: queue < int > Q;
for (int i = 0; i < n; ++ i)
level[i] = -1;
Q.push(node);
level[node] = 1;
while (!Q.empty()) {
int u = Q.front();
for (int i = 0; i < G[u].size(); ++ i) {
int x = G[u][i];
if (edges[x].cap > 0 && level[edges[x].v] == -1) {
level[edges[x].v] = level[u] + 1;
Q.push(edges[x].v);
}
}
Q.pop();
}
return (level[n - 1] != -1);
}
int DFSUtil(int node, int fl = 1e9) {
if (node == n - 1)
return fl;
else
if (fl == 0)
return 0;
else {
for (int &i = ptr[node]; i < G[node].size(); ++ i) {
int x = G[node][i];
if (level[edges[x].v] == level[node] + 1 && edges[x].cap > 0) {
int t = DFSUtil(edges[x].v, std :: min(fl, edges[x].cap));
if (t > 0) {
edges[x].cap -= t;
edges[x ^ 1].cap += t;
return t;
}
}
}
return 0;
}
}
int main() {
fin >> n >> m;
for (int i = 0, u, v, f; i < m; ++ i) {
fin >> u >> v >> f;
-- u, -- v;
int x = edges.size();
edges.push_back({u, v, f});
edges.push_back({v, u, 0});
G[u].push_back(x);
G[v].push_back(x + 1);
}
while (BFS(0)) {
for (int i = 0; i < n; ++ i)
ptr[i] = 0;
int t;
while (t = DFSUtil(0, 1e9))
flow += t;
}
fout << flow << "\n";
return 0;
}