Pagini recente » Cod sursa (job #2288946) | Cod sursa (job #1749807) | Cod sursa (job #2024581) | Cod sursa (job #2401931) | Cod sursa (job #1259892)
#include <cstdio>
#include <cstring>
#define INF 900000
using namespace std;
int flux[1001][1001], capacitate[1001][1001], tata[1001], q[1001], sursa=1, destinatie, sol=0;
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[0]=sursa; 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, j, r;
while (bfs(n)!=0)
{
for (i=1; i<=n; i++)
{
if (tata[i]==-1 || capacitate[i][destinatie]<=flux[i][destinatie]) continue;
r=INF; tata[n]=i;
for (j=n; j!=sursa && j!=0; j=tata[j])
{
r=min(r,capacitate[tata[j]][j]-flux[tata[j]][j]);
}
if (r<=0) continue;
for (j=n; j!=sursa; j=tata[j])
{
flux[tata[j]][j]+=r;
flux[j][tata[j]]-=r;
}
sol+=r;
}
}
}
int main()
{
int n, m, i, x, y, z;
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);
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}