Pagini recente » Cod sursa (job #717793) | Cod sursa (job #139012) | Cod sursa (job #545362) | Cod sursa (job #3284141) | Cod sursa (job #250753)
Cod sursa(job #250753)
#include <stdio.h>
#include <string.h>
long a[1010][1010], b[1010][1010];
int prec[1010], *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]]++;
cont[t2[i]]++;
scanf("%ld", &a[t1[i]][t2[i]]);
}//for i
for (i=1; i<=n; i++)
{
vecini[i]=new int[cont[i]+2];
vecini[i][0]=0;
}//for i
for (i=1; i<=m; i++)
{
vecini[t1[i]][++vecini[t1[i]][0]]=t2[i];
vecini[t2[i]][++vecini[t2[i]][0]]=t1[i];
}//for i
printf("%ld", flux_max(1, n));
return 0;
}//main
long flux_max(int s, int d)
{
long f=0, min;
int i, j, nod;
while (bf(s, d))
{
for (j=1; j<=vecini[d][0]; j++)
{
nod=vecini[d][j];
if ((prec[nod]>0)&&(a[nod][n]>b[n][nod]))
{
min=1000000000;
i=d;
prec[n]=nod;
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;
}//if
}//for j
}//while
return f;
}//flux_max
bool bf(int s, int d)
{
int p, u, coada[10010], t, i, j;
memset(prec, -1, sizeof(prec));
coada[0]=s;
prec[s]=-2;
p=0;
u=0;
while (p<=u)
{
t=coada[p++];
if (t==d)
return 1;
for (j=1; j<=vecini[t][0]; j++)
{
i=vecini[t][j];
if ((prec[i]==-1)&&((a[t][i]>b[t][i])))
{
coada[++u]=i;
prec[i]=t;
// if (i==d)
// return 1;
}//if
}//for i
}//while
return 0;
}//bf
long minim(long a, long b)
{
if (a<b)
return a;
else
return b;
}//minim