Pagini recente » Istoria paginii runda/cls11_round1 | Cod sursa (job #154345) | Diferente pentru home intre reviziile 480 si 481 | Istoria paginii runda/x_test67/clasament | Cod sursa (job #1274043)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#define MAXN 1000
#define MAXM 5000
#include <queue>
#include <vector>
using namespace std;
int N, M, x, y, c, maxf = 0;
vector<int> G[MAXN + 1];
int cap[MAXN + 1][MAXN + 1];
int flux[MAXN + 1][MAXN + 1];
int pred[MAXN + 1];
queue<int> q;
vector<int>::iterator it;
bool is_path() {
for(int i = 1; i <= N; ++i)
pred[i] = 0;
q.push(1);
pred[1] = 1;
while(!q.empty()) {
if(q.front() == N) {
q.pop();
continue;
}
for(it = G[q.front()].begin(); it!=G[q.front()].end(); ++it)
if(!pred[*it] && flux[q.front()][*it] < cap[q.front()][*it]) {
q.push(*it);
pred[*it] = q.front();
}
q.pop();
}
if(pred[N])
return 1;
return 0;
}
int main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin >> N >> M;
for(int i = 1; i <= M; ++i) {
cin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = c;
}
while(is_path()) {
for(it = G[N].begin(); it != G[N].end(); ++it)
if(flux[*it][N] < cap[*it][N] && pred[*it]) {
int fluxx = cap[*it][N] - flux[*it][N], nod = *it;
while(nod != 1)
{
fluxx = min(fluxx, cap[pred[nod]][nod] - flux[pred[nod]][nod]);
nod = pred[nod];
}
nod = *it;
flux[*it][N] += fluxx;
flux[N][*it] -= fluxx;
while(nod != 1) {
flux[pred[nod]][nod] += fluxx;
flux[nod][pred[nod]] -= fluxx;
nod = pred[nod];
}
maxf += fluxx;
}
}
cout << maxf;
return 0;
}