Pagini recente » Cod sursa (job #2260959) | Cod sursa (job #1913780) | Cod sursa (job #2489317) | Cod sursa (job #2385424) | Cod sursa (job #1254902)
#include <cstdio>
#include <cstring>
#define INF 900000
using namespace std;
int flux[1001][1001], capacitate[1001][1001], tata[1001], q[1001], sursa=1, destinatie;
int min (int x, int y)
{
if (x<y) return x;
return y;
}
int bfs (int n)
{
int p=1, u=1, nod, i;
memset(tata,0,sizeof(tata)); tata[sursa]=-1;
memset(q,0,sizeof(q)); q[1]=sursa;
while (p<=u)
{
nod=q[p];
for (i=1; i<=n; i++)
{
if (tata[i]==0 && flux[nod][i]<capacitate[nod][i])
{
q[++u]=i;
tata[i]=nod;
if (i==destinatie)
{
return 1;
}
}
}
p++;
}
return 0;
}
void flux_maxim (int n)
{
int i, r, f=0;
while (bfs(n)!=0)
{
r=INF; i=destinatie;
while (i!=sursa)
{
r=min(r,capacitate[tata[i]][i]-flux[tata[i]][i]);
i=tata[i];
}
i=destinatie;
while (i!=sursa)
{
flux[tata[i]][i]+=r;
flux[i][tata[i]]-=r;
i=tata[i];
}
f+=r;
}
}
int main()
{
int n, m, i, x, y, z, sol=0;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m); destinatie=n;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
capacitate[x][y]=z;
}
flux_maxim(n);
for (i=2; i<=n; i++)
{
sol+=flux[1][i];
}
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}