Pagini recente » Cod sursa (job #2416522) | Cod sursa (job #1193423) | Cod sursa (job #2111000) | Cod sursa (job #3273996) | Cod sursa (job #2410209)
#include <fstream>
#include <vector>
#include <cstring>
#include <climits>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
#define nmax 1003
int n, m, A[nmax][nmax], t[nmax], sursa, dest;
bool u[nmax];
vector<int> v[nmax];
int bfs() {
memset(t, -1, sizeof(t));
memset(u, 0, sizeof(u));
int Q[n], p = 0, q = 0;
Q[0] = sursa;
u[sursa] = 1;
while (p <= q) {
int nod = Q[p++];
for (int i = 0; i < v[nod].size(); ++i)
if (!u[v[nod][i]] && A[nod][v[nod][i]] > 0) {
t[v[nod][i]] = nod;
Q[++q] = v[nod][i];
u[v[nod][i]] = 1;
}
}
if (t[dest] + 1) return 1;
return 0;
}
int main()
{
f >> n >> m;
int x, y, c;
for (int i = 1; i <= m; ++i) {
f >> x >> y >> c;
A[x][y] = c;
v[x].push_back(y);
v[y].push_back(x);
}
int f = 0;
sursa = 1, dest = n;
while (bfs()) {
for (int i = 1; i < dest; ++i) {
if (t[i] + 1 && A[i][dest] > 0) {
int mini = INT_MAX;
mini = min(mini, A[i][dest]);
for (int j = i; j != sursa; j = t[j]) mini = min(mini, A[t[j]][j]);
if (mini < 0) continue;
A[i][dest] -= mini;
for (int j = i; j != sursa; j = t[j]) A[t[j]][j] -= mini, A[j][t[j]] += mini;
f += mini;
}
}
}
g << f << '\n';
return 0;
}