Pagini recente » Cod sursa (job #765863) | Cod sursa (job #1918369) | Cod sursa (job #650524) | Cod sursa (job #2732319) | Cod sursa (job #247173)
Cod sursa(job #247173)
#include <stdio.h>
#include <string.h>
long a[1010][1010], b[1010][1010], prec[1010];
int *vecini[1010], n, m;
long flux_max(int s, int d);
bool bf(int s, int d);
long minim(long a, long b);
int main()
{
int t1[5010], t2[5010], i, cont[1010];
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%d%d", &t1[i], &t2[i]);
cont[t1[i]]++;
scanf("%ld", &a[t1[i]][t2[i]]);
}//for i
for (i=1; i<=n; i++)
{
vecini[i]=new int[t1[i]+1];
vecini[i][0]=0;
}//for i
for (i=1; i<=m; i++)
vecini[t1[i]][++vecini[t1[i]][0]]=t2[i];
printf("%ld", flux_max(1, n));
return 0;
}//main
long flux_max(int s, int d)
{
long f=0, min;
int i;
while (bf(s, d))
{
min=120000;
i=d;
while (i!=s)
{
min=minim(min, a[prec[i]][i]-b[prec[i]][i]);
i=prec[i];
}//while
i=d;
while (i!=s)
{
b[prec[i]][i]+=min;
b[i][prec[i]]-=min;
i=prec[i];
}//while
f+=min;
}//while
return f;
}//flux_max
bool bf(int s, int d)
{
int p, u, coada[5010], t, i;
memset(prec, -1, sizeof(prec));
coada[0]=s;
prec[s]=-2;
p=0;
u=0;
while (p<=u)
{
t=coada[p++];
for (i=1; i<=vecini[t][0]; i++)
if ((prec[vecini[t][i]]==-1)&&((a[t][vecini[t][i]]-b[t][vecini[t][i]])>0))
{
coada[++u]=vecini[t][i];
prec[vecini[t][i]]=t;
if (coada[u]==d)
return 1;
}//if
}//while
return 0;
}//bf
long minim(long a, long b)
{
if (a<b)
return a;
else
return b;
}//minim