Pagini recente » Cod sursa (job #2730795) | Cod sursa (job #1173100) | Cod sursa (job #1834003) | Cod sursa (job #2383387) | Cod sursa (job #1047339)
#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];
int n, Maxflow, m;
vector<int>v[NMAX];
inline int dfs(int Nod){
if(Nod == n)
return 1;
Viz[Nod] = 1;
for(int i = 0; i < v[Nod].size(); ++ i){
int it = v[Nod][i];
if(Viz[it] == 0 && Flux[Nod][it] != Cap[Nod][it]){
dad[it] = Nod;
int ok = dfs(it);
if(ok == 1)
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(){
while(dfs(1)){
int Min = INF;
memset(Viz, 0, sizeof(Viz));
Min = father(n, Min);
Maxflow += Min;
father2(n, Min);
}
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;
}