Pagini recente » Cod sursa (job #1014416) | Istoria paginii runda/rar36 | Cod sursa (job #2642297) | Cod sursa (job #2632607) | Cod sursa (job #2664972)
#include <fstream>
#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 d[NMAX], t[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;
void BFS() {
int node = 1;
d[node] = true;
q.push(node);
while (!q.empty()) {
node = q.front();
q.pop();
for (int i : gr[node]) {
if (d[i] == false && val[node][i] < cap[node][i]) {
q.push(i);
t[i] = node;
d[i] = true;
}
}
}
}
void maxFlow() {
bool ok = true;
int fmin;
while(ok) {
memset(d, false, sizeof d);
memset(t, 0, sizeof t);
BFS();
ok = false;
fmin = 1e9;
for (int nod = N; nod >= 1; nod = t[nod]) {
if (nod == 1) {
ok = true;
}
else {
fmin = min(fmin, cap[t[nod]][nod] - val[t[nod]][nod]);
}
}
if (ok) {
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;
}