Pagini recente » Istoria paginii runda/rar39 | Istoria paginii runda/795353277152115565 | Cod sursa (job #2632509) | Cod sursa (job #2642418) | Cod sursa (job #2669350)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int cap[NMAX][NMAX], val[NMAX][NMAX];
int N, M;
vector<vector<int> > gr;
int t[NMAX];
bool d[NMAX];
void read() {
int x, y, cpy;
fin >> N >> M;
gr.resize(N + 1);
for (int i = 0; i < M; ++i) {
fin >> x >> y >> cpy;
cap[x][y] = cpy;
gr[x].push_back(y);
gr[y].push_back(x);
}
}
queue<int> q;
bool BFS() {
memset(d, false, sizeof d);
int node = 1;
d[node] = true;
q.push(node);
while (!q.empty()) {
node = q.front();
q.pop();
if (node != N) {
for (int i : gr[node]) {
if (d[i] == false && val[node][i] < cap[node][i]) {
q.push(i);
t[i] = node;
d[i] = true;
}
}
}
}
return d[N];
}
void maxFlow() {
int fmin;
while(BFS()) {
for (int nod : gr[N]) {
if (d[nod] && val[nod][N] < cap[nod][N]) {
fmin = 1e9;
t[N] = nod;
for (int nod = N; nod > 1; nod = t[nod]) {
fmin = min(fmin, cap[t[nod]][nod] - val[t[nod]][nod]);
}
for (int nod = N; nod > 1; nod = t[nod]) {
val[t[nod]][nod] += fmin;
val[nod][t[nod]] -= fmin;
}
}
}
}
}
int main()
{
read();
maxFlow();
int flow = 0;
for (int i = 1; i <= N; ++i) {
flow += val[i][N];
}
fout << flow << "\n";
return 0;
}