Pagini recente » Cod sursa (job #249208) | Cod sursa (job #2572615) | Cod sursa (job #1929358) | Cod sursa (job #2575697) | Cod sursa (job #1654778)
#include <algorithm>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define pb push_back
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int main() {
int n, m;
in >> n >> m;
vector < vector < int > > adj(n), flow(n, vector < int >(n, 0)), cap(n, vector < int >(n, 0));
for(int i = 1, a, b, c; i <= m; i++) {
in >> a >> b >> c;
a--; b--;
cap[a][b] = c;
adj[a].pb(b);
adj[b].pb(a);
}
vector < bool > vis(n, false);
vector < int > f(n, -1);
queue < int > q;
int rez = 0;
while(true) {
vis[0] = true;
f[0] = 0;
q.push(0);
while(!q.empty()) {
int x = q.front();
q.pop();
if(x == n - 1) continue;
for(auto i : adj[x]) {
if(!vis[i] && flow[x][i] < cap[x][i]) {
vis[i] = 1;
f[i] = x;
q.push(i);
}
}
}
if(!vis[n - 1]) break;
for(auto start : adj[n - 1]) {
if(!vis[start]) continue;
int minflow = 0x7fffffff;
f[n - 1] = start;
for(int i = n - 1; i != 0; i = f[i]) {
minflow = min(minflow, cap[f[i]][i] - flow[f[i]][i]);
}
if(minflow == 0) continue;
for(int i = n - 1; i != 0; i = f[i]) {
flow[f[i]][i] += minflow;
flow[i][f[i]] -= minflow;
}
rez += minflow;
fill(begin(f), end(f), -1);
fill(begin(vis), end(vis), false);
}
}
out << rez << '\n';
return 0;
}