Pagini recente » Cod sursa (job #2236860) | Cod sursa (job #1559268) | Cod sursa (job #3288995) | Cod sursa (job #730754) | Cod sursa (job #1454389)
#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],T[NMAX],F[NMAX][NMAX],q[NMAX]; vector<int> graf[NMAX];
bool v[NMAX];
bool BFS(){
int i,j,nod,V;
memset(v,0,sizeof(v));
q[0]=q[1]=1;
v[1]=1;
for (i=1; i<=q[0]; i++){
nod=q[i];
if (nod==N) continue;
for (j=0; j<graf[nod].size(); j++){
V=graf[nod][j];
if (C[nod][V]==F[nod][V] || v[V]) continue;
q[++q[0]]=V;
v[V]=1;
T[V]=nod;
}
}
return v[N];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&N,&M);
int i,nod,flow,fmin,x,y,c;
for (i=1; i<=M; i++){
scanf("%d %d %d",&x,&y,&c);
graf[x].push_back(y);
graf[y].push_back(x);
C[x][y]=c;
}
for (flow=0; BFS(); )
for (i=0; i<graf[N].size(); i++){
nod=graf[N][i];
if (C[nod][N]==F[nod][N] || !v[nod]) continue;
T[N]=nod;
fmin=INF;
for (nod=N; nod!=1; nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if (fmin==0) continue;
for (nod=N; nod!=1; nod=T[nod]){
F[T[nod]][nod]+=fmin;
F[nod][T[nod]]-=fmin;
}
flow+=fmin;
}
printf("%d\n",flow);
}