Pagini recente » Cod sursa (job #1874089) | Cod sursa (job #2180279) | Cod sursa (job #2511405) | Cod sursa (job #901833) | Cod sursa (job #250921)
Cod sursa(job #250921)
#include <stdio.h>
#include <string.h>
const int NMAX=1010;
const int MMAX=5010;
const int INF=1<<30;
int a[NMAX][NMAX], b[NMAX][NMAX], prec[NMAX], *vecini[NMAX], n, m;
int flux_max(int s, int d);
bool bf(int s, int d);
int minim(int a, int b);
int main()
{
int t1[MMAX], t2[MMAX], i, cont[NMAX];
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
int flux_max(int s, int d)
{
int f=0, min;
int i;
while (bf(s, d))
{
min=INF;
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[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++];
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
int minim(int a, int b)
{
if (a<b)
return a;
else
return b;
}//minim