Pagini recente » Cod sursa (job #2630596) | Cod sursa (job #1086771) | Cod sursa (job #46687) | Cod sursa (job #1145319) | Cod sursa (job #3467)
Cod sursa(job #3467)
#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 128
int c[maxn][maxn], n, f, l, m;
void citire()
{
// freopen("maxflow.in", "r", stdin);
scanf("%d %d %d %d\n", &n,&m, &f, &l);
for(int i=1;i<=m;i++)
{
int p, q, w;
scanf("%d %d %d\n", &p, &q ,&w);
c[p][q]=w;
}
}
int min(int a, int b) { if(a<b) return a; return b;}
int bfs(int s, int l)
{
int Q[maxn],viz[maxn],pred[maxn], p=1, q=1, u,i,cap;
memset(viz,0, sizeof(viz));
memset(pred, -1, sizeof(pred));
Q[1]=s;
viz[s]=1;
while(p<=q)
{
u=Q[p++];
for(i=1;i<=n;i++)
if(c[u][i]>0 && !viz[i])
{
viz[i]=1;
pred[i]=u;
Q[++q]=i;
if(i==l) goto exit_loop;
}
}
exit_loop:
if(pred[l]==-1) return 0;
for(u=l, cap=oo ; pred[u]!=-1 ; u=pred[u]) cap=min(cap,c[pred[u]][u]);
for(u=l; pred[u]!=-1; u=pred[u])
{
c[pred[u]][u]-=cap;
c[u][pred[u]]+=cap;
}
return cap;
}
int max_flow(int s, int l)
{
int flow=0;
int p;
while(1)
{
p=bfs(s, l);
if(p==0) break;
flow+=p;
}
return flow;
}
int main()
{
citire();
printf("%d\n", max_flow(f, l));
return 0;
}