Pagini recente » Cod sursa (job #2627158) | Cod sursa (job #1161990) | Cod sursa (job #846785) | Cod sursa (job #2535317) | Cod sursa (job #2292596)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
class Dinic {
struct Edge {
int cap, to, next; };
vector<Edge> edges;
vector<int> adj, at, dist;
int n, src, snk;
public:
void add_edge(int u, int v, int cap) {
edges.push_back({cap, v, adj[u]});
adj[u] = edges.size() - 1;
edges.push_back({cap, u, adj[v]});
adj[v] = edges.size() - 1; }
bool bfs() {
deque<int> dq;
int u;
fill(begin(dist), end(dist), 0);
dq.push_back(src);
dist[src] = 1;
while (!dq.empty()) {
u = dq.front();
dq.pop_front();
for (int link = adj[u]; link != -1; link = edges[link].next) {
Edge &edge = edges[link];
if (!dist[edge.to] && edge.cap > 0) {
dist[edge.to] = dist[u] + 1;
dq.push_back(edge.to); } } }
return dist[snk]; }
int dfs(int u, int flw = 1e9) {
if (u == snk)
return flw;
int augm;
for (int link = at[u]; link != -1; link = edges[link].next) {
Edge &e = edges[link];
if (e.cap > 0 && dist[u] + 1 == dist[e.to] && (augm = dfs(e.to, min(e.cap, flw))) > 0) {
edges[link ^ 1].cap+= augm;
edges[link].cap-= augm;
return augm; }
at[u] = edges[link].next; }
return 0; }
int get_flow(int _src, int _snk) {
int ant = 0, add;
src = _src, snk = _snk;
while (bfs()) {
at = adj;
while (add = dfs(src))
ant+= add; }
return ant; }
Dinic(int _n) {
n = _n + 1;
dist = adj = at = vector<int>(n + 1, -1); } };
Dinic *myflow;
int n, m;
int main() {
fi >> n >> m;
myflow = new Dinic(n);
for (int u, v, c, i = 0; i < m; ++i) {
fi >> u >> v >> c;
myflow->add_edge(u, v, c); }
fo << myflow->get_flow(1, n) << endl;
return 0; }