Pagini recente » Cod sursa (job #665817) | Cod sursa (job #1327997) | Cod sursa (job #372013) | Cod sursa (job #1114991) | Cod sursa (job #2695325)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct MaxFlow {
static const int N = 1010;
static const int oo = 1e9;
int cap[N][N], parent[N];
bool viz[N];
vector<int> v[N];
queue<int> q;
void add_edge(int x, int y, int c) {
cap[x][y] = c;
v[x].push_back(y);
v[y].push_back(x);
}
bool bfs(int sursa, int dest) {
memset(viz, false, sizeof(viz));
viz[sursa] = true;
q.push(sursa);
while(!q.empty()) {
int node = q.front();
q.pop();
for (int vec : v[node]) {
if (viz[vec] or !cap[node][vec]) continue;
viz[vec] = true;
parent[vec] = node;
if (vec != dest) q.push(vec);
}
}
return viz[dest] > 0;
}
int Ford_Furkerson(int sursa, int dest) {
int max_flow = 0;
while(bfs(sursa, dest)) {
for (int vec : v[dest]) {
if (!viz[vec] or !cap[vec][dest])
continue;
int s = oo;
parent[dest] = vec;
for (int node = dest; node != sursa; node = parent[node])
s = min(s, cap[parent[node]][node]);
for (int node = dest; node != sursa; node = parent[node]) {
cap[parent[node]][node] -= s;
cap[node][parent[node]] += s;
}
max_flow += s;
}
}
return max_flow;
}
} G;
int main()
{
int n, m, x, y, c;
in >> n >> m;
for (int i = 1; i <= m; ++i) {
in >> x >> y >> c;
G.add_edge(x, y, c);
}
out << G.Ford_Furkerson(1, n);
return 0;
}