Pagini recente » Cod sursa (job #499735) | Cod sursa (job #1070485) | Cod sursa (job #1708479) | Cod sursa (job #2244899) | Cod sursa (job #1268151)
#include <iostream>
#include <fstream>
#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];
bool viz[MAXN + 1];
int pred[MAXN + 1];
vector<int>::iterator it;
bool bfs(int node) {
queue<int> q;
q.push(node);
viz[q.front()] = 1;
while(!q.empty()) {
int cur = q.front();
q.pop();
for(it = G[cur].begin(); it != G[cur].end(); ++it) {
if(!viz[*it] && cap[cur][*it] - flux[cur][*it] > 0) {
pred[*it] = cur;
viz[*it] = 1;
q.push(*it);
if(*it == N)
return 1;
}
}
}
return 0;
}
void change_flow() {
int fmin, nod = N;
fmin = (1LL << 30) - 1;
while(pred[nod]) {
if(cap[pred[nod]][nod] - flux[pred[nod]][nod] < fmin) {
fmin = cap[pred[nod]][nod] - flux[pred[nod]][nod];
}
nod = pred[nod];
}
nod = N;
while(pred[nod]) {
flux[pred[nod]][nod] += fmin;
//G[nod].push_back(pred[nod]);
flux[nod][pred[nod]] -= fmin;
nod = pred[nod];
}
maxf += fmin;
}
int main() {
//std::ios_base.sync_with_stdio(false);
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(bfs(1)) {
change_flow();
for(int i = 1; i <= N; ++i)
viz[i] = pred[i] = 0;
}
cout << maxf;
return 0;
}