Pagini recente » Cod sursa (job #2899029) | Cod sursa (job #2122355) | Cod sursa (job #1452818) | Cod sursa (job #1498088) | Cod sursa (job #2284866)
#include <bits/stdc++.h>
using namespace std;
const int DIM_MAX = 1010;
namespace Flow {
struct Edge {
int from, to, cap;
};
vector <Edge> edges;
vector <int> adia[DIM_MAX];
int viz[DIM_MAX];
int s, d, c, n, t;
bool dfs(int nod) {
viz[nod] = t;
if (nod == d)
return true;
for (auto i : adia[nod]) {
if (edges[i].cap >= c && viz[edges[i].to] < t && dfs(edges[i].to)) {
edges[i].cap -= c;
edges[i ^ 1].cap += c;
return true;
}
}
return false;
}
void add_edge(int from, int to, int cap) {
adia[from].push_back(edges.size());
edges.push_back({ from, to, cap });
adia[to].push_back(edges.size());
edges.push_back({ to, from, 0 });
}
inline int max_flow(int _s, int _d) {
s = _s, d = _d;
int flow = 0;
for (c = 110000; c; ) {
t++;
if (dfs(s))
flow += c;
else
c /= 2;
}
return flow;
}
}
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n) {
while (buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while ('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++cursor;
if (cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
int main()
{
InputReader in("maxflow.in");
ofstream out("maxflow.out");
int n, m, a, b, c;
in >> n >> m;
while (m--) {
in >> a >> b >> c;
Flow::add_edge(a, b, c);
}
out << Flow::max_flow(1, n) << '\n';
return 0;
}