Pagini recente » Cod sursa (job #120102) | Cod sursa (job #2652976) | Cod sursa (job #1416951) | Cod sursa (job #2638709) | Cod sursa (job #2840111)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 99999999
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N, M;
int cap[NMAX][NMAX], flow[NMAX][NMAX];
int tt[NMAX];
vector<vector<int>> gr;
void read() {
fin >> N >> M;
gr.resize(N + 1);
int x, y, c;
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 nod) {
int mini = INF;
queue<int> q;
q.push(nod);
tt[nod] = -1;
while (!q.empty()) {
nod = q.front();
q.pop();
for (int x : gr[nod]) {
if (tt[x] == 0 && flow[nod][x] < cap[nod][x]) {
q.push(x);
tt[x] = nod;
mini = min(mini, cap[nod][x] - flow[nod][x]);
}
}
}
if (mini == INF) {
return 0;
}
return mini;
}
int main()
{
read();
int f = BFS(1);
while (f) {
for (int i = N; i >= 1; i = tt[i]) {
if (i != 1) {
flow[i][tt[i]] -= f;
flow[tt[i]][i] += f;
}
}
memset(tt, 0, sizeof(tt));
f = BFS(1);
}
int flux = 0;
for (int i = 1; i <= N; ++i) {
flux += flow[i][N];
}
fout << flux << "\n";
return 0;
}