Pagini recente » Cod sursa (job #2514153) | Cod sursa (job #2303782) | Cod sursa (job #141911) | Cod sursa (job #2866462) | Cod sursa (job #3231097)
#include <fstream>
#include <vector>
#include <set>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
struct Edge {
int from;
int to;
int cap;
int flow;
Edge *back;
Edge(int f, int t, int c, int ff, Edge *b) : from(f), to(t), cap(c), flow(ff), back(b) {}
};
pair<int, vector<Edge *> > bfs(vector<vector<Edge *> > edges, int n) {
vector<int> vis(n+1, 0);
vector<Edge *> predec(n+1, 0);
queue<int> q;
predec[1] = nullptr;
q.push(1);
while(!q.empty()) {
int nod = q.front();
vis[nod] = 1;
if (nod == n)
break;
q.pop();
for (Edge *edge : edges[nod]) {
int neigh = edge->to;
int cap = edge->cap;
int flow = edge->flow;
if (!(flow == cap || vis[neigh])) {
q.push(neigh);
predec[neigh] = edge;
}
}
}
return make_pair(vis[n], predec);
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<Edge *> > edges(n+1);
for (int i = 0; i < m; ++i) {
int x, y, c;
cin >> x >> y >> c;
Edge* ed = new Edge(x, y, c, 0, nullptr);
Edge* rev = new Edge(y, x, 0, 0, ed);
ed->back = rev;
edges[x].push_back(ed);
edges[y].push_back(rev);
}
long long deff = 0;
while(true) {
auto pg = bfs(edges, n);
auto ok = pg.first;
auto predec = pg.second;
if (!ok)
break;
int flow = 1000001;
for (Edge* edge = predec[n]; edge != nullptr; edge = predec[edge->from]) {
flow = min (flow, edge->cap - edge->flow);
}
if (flow == 0)
break;
for (Edge* edge = predec[n]; edge != nullptr; edge = predec[edge->from]) {
edge->flow = edge->flow + flow;
edge->back->flow = edge->back->flow - flow;
}
deff += flow;
}
cout << deff;
}