Pagini recente » Cod sursa (job #1541009) | Cod sursa (job #2314643) | Cod sursa (job #2514843) | Cod sursa (job #1120755) | Cod sursa (job #2453540)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
#define inf 100000000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int capacitate[1024][1024], flux[1024][1024], t[1024], v[1024], n, m;
vector<int> g[1024];
queue<int> q;
int minim(int a, int b) {
if(a < b)
return a;
return b;
}
int bfs() {
for(int i = 1; i <= n; i++)
v[i] = 0;
int k;
v[1] = 1;
q.push(1);
while(!q.empty()) {
k = q.front();
if(k != n)
for(int i = 0; i < g[k].size(); i++) {
int vecin = g[k][i];
if(capacitate[k][vecin] != flux[k][vecin] && !v[vecin]) {
v[vecin] = 1;
q.push(vecin);
t[vecin] = k;
}
}
q.pop();
}
return v[n];
}
int main() {
fin >> n >> m;
for(int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
capacitate[x][y] += c;
g[x].push_back(y);
g[y].push_back(x);
}
int flow, fmin;
for(flow = 0; bfs(); )
for(int i = 0; i < g[n].size(); i++) {
int nod = g[n][i];
if(capacitate[nod][n] != flux[nod][n]) {
t[n] = nod;
fmin = inf;
for(int nod = n; nod != 1; nod = t[nod])
fmin = minim(fmin, capacitate[t[nod]][nod]-flux[t[nod]][nod]);
if(fmin) {
for(int nod = n; nod != 1; nod = t[nod]) {
flux[t[nod]][nod] += fmin;
flux[nod][t[nod]] -= fmin;
}
flow += fmin;
}
}
}
fout << flow;
}