Pagini recente » Cod sursa (job #1128239) | Cod sursa (job #2495983) | Cod sursa (job #2532376) | Cod sursa (job #2536749) | Cod sursa (job #1215440)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 2048;
int resid[NMAX][NMAX];
int from[NMAX];
int N, M;
int flow, extra;
bool BFS()
{
queue <int> q;
for (int i = 0; i < NMAX; ++i) {
from[i] = 0;
}
from[0] = 0;
from[1] = 0;
q.push(1);
while (!q.empty()) {
int node = q.front();
q.pop();
for (int i = 1; i <= N + extra; ++i) {
if (from[i] == 0 && resid[node][i] > 0) {
from[i] = node;
q.push(i);
if (i == N) {
return true;
}
}
}
}
return false;
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
in >> N >> M;
for (int i = 0; i < NMAX; ++i) {
for (int j = 0; j < NMAX; ++j) {
resid[i][j] = -1;
}
}
extra = 1;
for (int i = 0; i < M; ++i) {
int a, b, c;
in >> a >> b >> c;
if (resid[a][b] >= 0) {
resid[a][N + extra] = c;
resid[N + extra][a] = 0;
resid[N + extra][b] = c;
resid[b][N + extra] = 0;
extra++;
} else {
resid[a][b] = c;
resid[b][a] = 0;
}
}
while (BFS()) {
for (int i = 1; i < N + extra; ++i) {
if (resid[i][N] > 0) {
if (from[i] == 0 || resid[i][N] == 0) {
continue;
} else {
from[N] = i;
int add = INT_MAX;
int x = N;
while (x != 1) {
add = min(add, resid[from[x]][x]);
x = from[x];
}
if (add == 0) {
continue;
}
x = N;
while (x != 1) {
resid[from[x]][x] -= add;
resid[x][from[x]] += add;
x = from[x];
}
flow += add;
}
}
}
}
out << flow;
return 0;
}