Pagini recente » Cod sursa (job #1228095) | Cod sursa (job #1173704) | Cod sursa (job #932545) | Cod sursa (job #2495959) | Cod sursa (job #464226)
Cod sursa(job #464226)
//Ford-fulkerson cu bfs
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define DM 5001
#define DN 1001
int capac[DN][DN],//capacitatea
F[DN][DN],//A matrix giving a legal flow with the maximum value
fm,//fluxul maxim
n,m,
f[DN];
queue <int> coada;
bool bfs() {
int i,x;
memset(f,-1,sizeof(f));
f[1]=0;
for(coada.push(1);coada.size(); ) {
x=coada.front();
coada.pop();
for(i=1; i<=n; i++)
if(f[i]==-1 && capac[x][i]>F[x][i]) {//un fel de relaxare
f[i]=x;
coada.push(i);
}
}
return f[n]!=-1;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,x,y,c;
scanf("%d %d",&n ,&m );
for(i=1; i<=m; i++) {
scanf("%d %d",&x ,&y );
scanf("%d",&capac[x][y]);
}
while (bfs())
for(x=1; x<=n; x++)
if(capac[x][n]>F[x][n]) {
c=capac[x][n]-F[x][n];//capacitatea reziduala de la u la v= capac[u][v] - F[u][v];
for( y=x; f[y]; y=f[y] )
c=min(c,capac[f[y]][y]-F[f[y]][y]);
fm+=c;
F[x][n]+=c;
F[n][x]-=c;
for( y=x; f[y]; y=f[y] ) {//actualizare
F[f[y]][y]+=c;
F[y][f[y]]-=c;
}
}
printf("%d",fm);
return 0;
}