Pagini recente » Cod sursa (job #1088918) | Cod sursa (job #1636353) | Cod sursa (job #2216621) | Cod sursa (job #1731547) | Cod sursa (job #254009)
Cod sursa(job #254009)
#include <stdio.h>
const int NMAX=1010;
const int MMAX=5010;
const long INF=100000000;
int *a[NMAX], x[MMAX], y[MMAX], i, n, m, q[NMAX], prec[NMAX], cont[NMAX], flux[NMAX][NMAX];
long c[NMAX][NMAX], z;
long long f;
void flux_max(int s, int d);
bool bf(int s, int d);
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i=0; i<m; i++)
{
scanf("%d%d%ld", &x[i], &y[i], &z);
cont[x[i]]++;
cont[y[i]]++;
c[x[i]][y[i]]=z;
}//for i
for (i=1; i<=n; i++)
{
a[i]=new int[cont[i]+1];
a[i][0]=0;
}//for i
for (i=0; i<m; i++)
{
a[x[i]][++a[x[i]][0]]=y[i];
a[y[i]][++a[y[i]][0]]=x[i];
}//for i
flux_max(1, n);
printf("%lld\n", f);
return 0;
}//main
void flux_max(int s, int d)
{
long min;
int i;
while (bf(s, d))
{
min=INF;
i=d;
while (i!=s)
{
if ((c[prec[i]][i]-flux[prec[i]][i])<min)
min=c[prec[i]][i]-flux[prec[i]][i];
i=prec[i];
}//while
i=d;
while (i!=s)
{
flux[prec[i]][i]+=min;
flux[i][prec[i]]-=min;
i=prec[i];
}//while
f+=min;
}//while
}//flux_max
bool bf(int s, int d)
{
int u=0, p=0, t, i, j;
for (i=1; i<=n; i++)
prec[i]=-1;
q[u]=s;
prec[s]=-2;
while (p<=u)
{
t=q[p++];
for (i=1; i<=a[t][0]; i++)
{
j=a[t][i];
if ((prec[j]==-1)&&(c[t][j]>flux[t][j]))
{
q[++u]=j;
prec[j]=t;
if (j==d)
return 1;
}//if
}//for i
}//while
return 0;
}//bf