Pagini recente » Cod sursa (job #869125) | Cod sursa (job #330036) | Cod sursa (job #1811627) | Cod sursa (job #537104) | Cod sursa (job #2588601)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1010;
int N, M, flux;
int father[NMAX];
int cap[NMAX][NMAX], flow[NMAX][NMAX];
bool seen[NMAX];
vector <int> edges[NMAX];
queue <int> Q;
void read(){
scanf("%d%d", &N, &M);
int a, b, c;
for(int i = 1; i <= M; i++){
scanf("%d%d%d", &a, &b, &c);
edges[a].push_back(b);
edges[b].push_back(a);
cap[a][b] = c;;
}
}
bool bellman_ford(){
Q.push(1);
seen[1] = true;
while(!Q.empty()){
int node = Q.front();
Q.pop();
for(int i = 0; i < edges[node].size(); i++){
int x = edges[node][i];
if(!seen[x] && cap[node][x] - flow[node][x] > 0){
Q.push(x);
father[x] = node;
seen[x] = true;
}
}
}
if(!father[N])
return false;
int node = N;
for(int i = 0; i < edges[node].size(); i++){
int x = edges[node][i];
if(cap[x][N] - flow[x][N] > 0){
int Min = cap[x][N] - flow[x][N];
for(int j = x; j != 1; j = father[j])
if(cap[father[j]][j] - flow[father[j]][j] < Min)
Min = cap[father[j]][j] - flow[father[j]][j];
flow[x][N] += Min;
flow[N][x] -= Min;
for(int j = x; j != 1; j = father[j]){
flow[father[j]][j] += Min;
flow[j][father[j]] -= Min;
}
flux += Min;
}
}
return true;
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
read();
bool retry = 1;
while(retry){
retry = false;
for(int i = 1; i <= N; i++){
father[i] = 0;
seen[i] = false;
}
retry = bellman_ford();
}
printf("%d", flux);
return 0;
}