Pagini recente » Cod sursa (job #2917404) | Cod sursa (job #2410352) | Cod sursa (job #3183382) | Cod sursa (job #164647) | Cod sursa (job #1262792)
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int c[1005][1005],f[1005][1005],viz[1005],pred[1005],n;
queue <int> q;
bool BFS(int nod)
{
int aux;
viz[nod]=1;
while (!q.empty())
q.pop();
q.push(nod);
while (!q.empty())
{
aux=q.front();
if (aux==n)
return 1;
for (register int i=1;i<=n;++i)
{
if (c[aux][i]-f[aux][i]>0&&viz[i]==0)
{
viz[i]=1;
pred[i]=aux;
q.push(i);
}
}
q.pop();
}
}
int main()
{
int m,x,y,cap,fmin,fmax=0;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for (register int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&cap);
c[x][y]=c[y][x]=cap;
}
fmax=0;
while(BFS(1))
{
//avem drum
fmin=(1LL<<31)-1;
for (register int i=n;i!=1;i=pred[i])
fmin=min(fmin,c[pred[i]][i]-f[pred[i]][i]);
fmax+=fmin;
for (register int i=n;i!=1;i=pred[i])
{
f[pred[i]][i]+=fmin;
f[i][pred[i]]-=fmin;
}
memset(viz,0,sizeof(viz));
}
printf("%d",fmax);
return 0;
}