Pagini recente » Cod sursa (job #3041413) | Cod sursa (job #2782913) | Cod sursa (job #1947443) | Cod sursa (job #1454380)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#define NMAX 1010
#define INF (1<<30)
using namespace std;
int N,M,C[NMAX][NMAX],F[NMAX][NMAX],cd[NMAX],TT[NMAX]; vector<int> graf[NMAX];
bool viz[NMAX];
bool BFS(){
int i,j,nod,V;
cd[0]=cd[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for (i=1; i<=cd[0]; i++){
nod=cd[i];
if (nod==N) continue;
for (j=0; j<graf[nod].size(); j++){
V=graf[nod][j];
if (C[nod][V]==F[nod][V] || viz[V]) continue;
viz[V]=1;
cd[++cd[0]]=V;
TT[V]=nod;
}
}
return viz[N];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&N,&M);
int i,x,y,c,flow,fmin,nod;
for (i=1; i<=M; i++){
scanf("%d %d %d",&x,&y,&c);
C[x][y]=c;
graf[x].push_back(y);
graf[y].push_back(x);
}
for (flow=0; BFS(); )
for (i=0; i<graf[N].size(); i++){
nod=graf[N][i];
if (F[nod][N] == C[nod][N] || !viz[nod]) continue;
fmin=INF;
for (nod=N; nod!=1; nod=TT[nod])
fmin=min(fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
if (fmin==0) continue;
for (nod=N; nod!=1; nod=TT[nod]){
F[TT[nod]][nod]+=fmin;
F[nod][TT[nod]]-=fmin;
}
flow+=fmin;
}
printf("%d",flow);
return 0;
}