Pagini recente » Cod sursa (job #1063528) | Cod sursa (job #1246507) | Cod sursa (job #1123358) | Cod sursa (job #1262617) | Cod sursa (job #2884345)
#include<iostream>
#include<bitset>
#include<vector>
#include<fstream>
#include<queue>
#define NMAX 1001
const int INF = 2e9;
std::ifstream in("maxflow.in");
std::ofstream out("maxflow.out");
std::vector<int>viz, d, g[NMAX];
int n, m;
long long a[NMAX][NMAX];
using namespace std;
void add_edge(int x, int y, int c) {
a[x][y] = c;
g[x].push_back(y);
g[y].push_back(x);
}
inline bool bfs(int const& source = 1, int const& sink = n) {
viz = vector<int>(n + 1);
queue<int>coada;
viz[source] = 1;
d[source] = 1;
coada.push(source);
while (!coada.empty()) {
int node = coada.front();
coada.pop();
if (node == sink) continue;
for (auto i : g[node]) {
if (!viz[i] && a[node][i]) {
viz[i] = 1;
d[i] = node;
coada.push(i);
}
}
}
return viz[sink];
}
long long maxflow(const int& source = 1, const int& sink = n) {
long long maxi = 0;
while (bfs()) {
for (auto node : g[sink]) {
if (a[node][sink] < 1 || !viz[node]) continue;
d[sink] = node;
long long flow = INF;
for (int i = sink; i != source; i = d[i])
flow = min(flow, a[d[i]][i]);
if (flow < 1) continue;
for (int i = sink; i != source; i = d[i]) {
a[d[i]][i] -= flow;
a[i][d[i]] += flow;
}
maxi += flow;
}
}
return maxi;
}
int main() {
in >> n >> m;
d = vector<int>(n + 1);
int x, y, c;
for (int i = 0; i < m; i++) {
in >> x >> y >> c;
add_edge(x, y, c);
}
out << maxflow();
return 0;
}