Pagini recente » Cod sursa (job #1194821) | Cod sursa (job #2274362) | Cod sursa (job #250094) | Cod sursa (job #1698639) | Cod sursa (job #2025717)
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#define N 1001
#define INF 550000001
using namespace std;
int n, m;
vector<int> G[N];
int capacity[N][N], flow[N][N];
int ant[N], fmin[N];
bool BFS(){
queue<int> que;
bool ok = 0;
que.push(1);
memset(fmin, 0, sizeof(fmin));
fmin[1] = INF;
while(!que.empty()){
int node = que.front();
que.pop();
for(auto next : G[node])
if(fmin[next] == 0 && capacity[node][next] - flow[node][next] != 0){
if(next == n) {ok = 1; continue;}
fmin[next] = min(fmin[node], capacity[node][next] - flow[node][next]);
ant[next] = node;
que.push(next);
}
}
return ok;
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++){
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
G[x].push_back(y);
G[y].push_back(x);
capacity[x][y] = c;
}
int maxFlow = 0;
while(BFS()){
for(auto next : G[n])
if(fmin[next] != 0){
int node = n;
ant[n] = next;
maxFlow += fmin[next];
while(node != 1){
flow[node][ant[node]] -= fmin[next];
flow[ant[node]][node] += fmin[next];
node = ant[node];
}
}
}
printf("%d", &maxFlow);
return 0;
}