Pagini recente » Cod sursa (job #3177659) | Cod sursa (job #2908528) | Cod sursa (job #2549923) | Cod sursa (job #2976710) | Cod sursa (job #2870308)
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M;
int flow[NMAX][NMAX], cap[NMAX][NMAX];
int t[NMAX];
vector<vector<int> > gr;
int x, y, c;
void read() {
fin >> N >> M;
gr.resize(N + 1);
for (int i = 0; i < M; ++i) {
fin >> x >> y >> c;
gr[x].push_back(y);
gr[y].push_back(x);
cap[x][y] = c;
}
}
int BFS(int node) {
int mini = INF;
queue<int> q;
memset(t, 0, sizeof(t));
q.push(node);
while (!q.empty()) {
node = q.front();
q.pop();
for (int i : gr[node]) {
if (flow[node][i] < cap[node][i] && t[i] == 0) {
mini = min(mini, cap[node][i] - flow[node][i]);
t[i] = node;
q.push(i);
}
}
}
if (t[N] != 0)
return mini;
return INF;
}
int main()
{
read();
int can_add = BFS(1);
while (can_add != INF) {
for (int i = N; i > 1; i = t[i]) {
flow[t[i]][i] += can_add;
flow[i][t[i]] -= can_add;
}
can_add = BFS(1);
}
int sum = 0;
for (int i = 1; i <= N; ++i) {
sum += flow[1][i];
}
fout << sum << "\n";
return 0;
}