Pagini recente » Cod sursa (job #1094407) | Cod sursa (job #1048456)
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<string.h>
#define x first
#define y second
#define NMAX 1007
#define INF 100000000
using namespace std;
int Cap[NMAX][NMAX], Flux[NMAX][NMAX], Viz[NMAX], dad[NMAX], q[NMAX];
int n, Maxflow, m;
vector<int>v[NMAX];
inline int bfs(int st, int dr){
int start = 0, avans = 0;
q[avans++] = st;
dad[st] = -2;
while(avans > start && dad[dr] == -1){
int Nod = q[start++];
for(int i = 0; i < v[Nod].size(); ++ i)
if(dad[v[Nod][i]] == -1 && Flux[Nod][v[Nod][i]] < Cap[Nod][v[Nod][i]]){
q[avans++] = v[Nod][i];
dad[v[Nod][i]] = Nod;
if(v[Nod][i] == n)
return 1;
}
}
return 0;
}
inline int father(int Nod, int Min){
if(Nod == 1)
return Min;
int Dad = dad[Nod];
Min = min(Min, Cap[Dad][Nod] - Flux[Dad][Nod]);
return father(dad[Nod], Min);
}
void father2(int Nod, int Min){
if(Nod == 1)
return;
int Dad = dad[Nod];
Flux[Nod][Dad] -= Min;
Flux[Dad][Nod] += Min;
father2(dad[Nod], Min);
}
inline int fluxmax(){
memset(dad, -1, sizeof(dad));
while(bfs(1, n)){
int Min = INF;
memset(Viz, 0, sizeof(Viz));
Min = father(n, Min);
Maxflow += Min;
father2(n, Min);
memset(dad, -1, sizeof(dad));
}
return Maxflow;
}
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 a = 0, b = 0, c = 0;
scanf("%d %d %d", &a, &b, &c);
v[a].push_back(b);
v[b].push_back(a);
Cap[a][b] = c;
Flux[a][b] = 0;
}
printf("%d", fluxmax());
return 0;
}