Pagini recente » Cod sursa (job #383174) | Clasamentul arhivei de probleme | Cod sursa (job #942061) | Cod sursa (job #2338344) | Cod sursa (job #371577)
Cod sursa(job #371577)
using namespace std;
#include <cstdio>
#define MAX 1005
#define INFINIT 1<<30
int cap[MAX][MAX], //capacitatile
n , //numarul de arce
tata[MAX], //vectorul de tati de la bfs
predest[MAX], nrPrecD; // precedentii destinatiei
void read(){
freopen("maxflow.in","r",stdin);
int m,i,j,c;
scanf("%d%d", &n , &m);
for( ; m ; --m){
scanf("%d%d%d", &i,&j,&c);
cap[i][j] += c;
if(j==n){
predest[++nrPrecD]=i;
}
}
}
int bfs(int sursa, int dest){
int coada[MAX], st=1,dr=1,k,i;
for(i=1;i<=n;++i)
tata[i] = -1;
tata[sursa]=0;
coada[1]=sursa;
while(st<=dr){
k = coada[st];
if(k==dest)
return 1;
for(i=1;i<=n;i++)
if(tata[i]==-1 && cap[k][i]){
coada[++dr] = i;
tata[i] = k;
}
st++;
}
return 0;
}
int main(){
read();
int fluxMaxim=0,fmin, k, v;
while(bfs(1,n)){
for(int i=1;i<=nrPrecD;++i){
k = predest[i];
if(!cap[k][n] || tata[k]==-1)
continue;
tata[n] = k;
v=n;
fmin=INFINIT;
while(k=tata[v]){
if(cap[k][v] < fmin)
fmin = cap[k][v];
v = k;
}
fluxMaxim += fmin;
v = n;
while(k = tata[v]){
cap[k][v] -= fmin;
cap[v][k] += fmin;
v = k;
}
}
}
freopen("maxflow.out","w",stdout);
printf("%d\n", fluxMaxim);
return 0;
}