Pagini recente » Cod sursa (job #1670034) | Cod sursa (job #1391105) | Cod sursa (job #1660834) | Cod sursa (job #2405472) | Cod sursa (job #2728198)
#include <bits/stdc++.h>
using namespace std;
#define int unsigned int
ofstream out("maxflow.out");
const int inf = (int)1e9 + 5;
const int max_n = (int)1e3 + 5;
int n, m;
int r[max_n][max_n];
vector<int> g[max_n];
bool visited[max_n];
int lvl[max_n];
class InParser {
private:
FILE *fin;
char *buff;
int sp;
static const int zz = 3000;
char read_ch() {
++sp;
if (sp == zz) {
sp = 0;
fread(buff, 1, zz, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[zz]();
sp = zz - 1;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
bool bfs() {
for (int i = 1; i <= n; ++i) {
visited[i] = false;
}
queue<int> q;
visited[1] = true;
q.push(1);
while ((int)q.size() > 0) {
int u = q.front();
q.pop();
for (int v : g[u]) {
if (!visited[v] && r[u][v] > 0) {
q.push(v);
visited[v] = true;
lvl[v] = 1 + lvl[u];
}
}
}
return visited[n];
}
InParser in("maxflow.in");
int dfs(int u, int flow) {
if (u == n) {
return flow;
}
for (int v : g[u]) {
if (!visited[v] && r[u][v] > 0) {
if (lvl[v] == 1 + lvl[u]) {
int res = dfs(v, min(flow, r[u][v]));
if (res > 0) {
r[u][v] -= res;
r[v][u] += res;
return res;
} else {
visited[v] = true;
}
}
}
}
return 0;
}
int32_t main() {
in >> n >> m;
for (int i = 1; i <= m; ++i) {
int u, v, c;
in >> u >> v >> c;
r[u][v] += c;
g[u].push_back(v);
g[v].push_back(u);
}
int flow = 0;
while (bfs() == true) {
int pmp;
for (int i = 1; i <= n; ++i) {
visited[i] = false;
}
while (pmp = dfs(1, inf)) {
for (int i = 1; i <= n; ++i) {
visited[i] = false;
}
flow += pmp;
}
}
out << flow << "\n";
return 0;
}