Mai intai trebuie sa te autentifici.
Cod sursa(job #254014)
Utilizator | Data | 6 februarie 2009 15:21:24 | |
---|---|---|---|
Problema | Flux maxim | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.42 kb |
#include <stdio.h>
#include <string.h>
const int NMAX=1010;
const int MMAX=5010;
const long INF=100000000;
int cont[NMAX], q[NMAX], prec[NMAX], *a[NMAX], n;
long flux[NMAX][NMAX], c[NMAX][NMAX];
long long f;
void flux_max(int s, int d);
bool bf(int s, int d);
int main()
{
int x[MMAX], y[MMAX], i, m;
long z;
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;
memset(prec, -1, sizeof(prec));
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