Pagini recente » Cod sursa (job #3274929) | Cod sursa (job #363204) | Cod sursa (job #537796) | Cod sursa (job #700373) | Cod sursa (job #1966900)
#include <bits/stdc++.h>
#define maxN 1002
#define inf 0x7fffffff
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
using namespace std;
/*---------Input data-------*/
int N, M, S, D;
vector <int> G[maxN];
/*---------Flow data--------*/
int flow, r[maxN][maxN], dad[maxN];
queue <int> q;
bool bfs(){
for(int i = 1; i <= N; ++ i)
dad[i] = 0;
dad[1] = 1;
q.push(S);
while(q.size()){
int node = q.front();
q.pop();
for(int son : G[node]){
if(dad[son] || r[node][son] == 0) continue;
dad[son] = node;
if(son != D)
q.push(son);
}
}
return dad[D] != 0;
}
void Flow(){
while(bfs()){
for(int node : G[D])
if(dad[node]){
dad[D] = node;
int pathFlow = inf;
node = D;
while(node != S){
pathFlow = min(pathFlow, r[dad[node]][node]);
node = dad[node];
}
node = D;
while(node != S){
r[dad[node]][node] -= pathFlow;
r[node][dad[node]] += pathFlow;
node = dad[node];
}
flow += pathFlow;
}
}
}
int main(){
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);
r[x][y] = c;
}
S = 1, D = N;
Flow();
printf("%d\n", flow);
return 0;
}