Pagini recente » Cod sursa (job #2578497) | Istoria paginii runda/ce_spun_romanii/clasament | Cod sursa (job #299028) | Cod sursa (job #223335) | Cod sursa (job #2025716)
#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], flux[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] - flux[node][next] != 0){
if(next == n) {ok = 1; continue;}
fmin[next] = min(fmin[node], capacity[node][next] - flux[node][next]);
ant[next] = node;
que.push(next);
}
}
return ok;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i ++){
int x, y, c;
cin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
capacity[x][y] = c;
}
int fluxMax = 0;
while(BFS()){
for(auto next : G[n])
if(fmin[next] != 0){
int node = n;
ant[n] = next;
fluxMax += fmin[next];
while(node != 1){
flux[node][ant[node]] -= fmin[next];
flux[ant[node]][node] += fmin[next];
node = ant[node];
}
}
}
cout << fluxMax;
return 0;
}