Pagini recente » Cod sursa (job #2645988) | Cod sursa (job #2642638) | Cod sursa (job #2930257) | Cod sursa (job #3289665) | Cod sursa (job #296606)
Cod sursa(job #296606)
#include<stdio.h>
#define N_MAX 1024
#define INF 0x7FFFFFFF
struct entry
{
int val;
entry *adr;
} *start[N_MAX];
void add(int val, int unde)
{
entry *p=new entry;
p->val=val;
p->adr=NULL;
if (start[unde]==NULL)
start[unde]=p;
else
{
p->adr=start[unde];
start[unde]=p;
}
}
int n, m, c[N_MAX][N_MAX], cd[N_MAX*N_MAX], best[N_MAX], last[N_MAX];
char sel[N_MAX];
inline int min(int a, int b)
{
if (a<b) return a;
return b;
}
int drum()
{
int nivel=1, i;
entry *p;
for (i=1; i<=n; i++)
sel[i]=best[i]=last[i]=0;
cd[1]=1;
best[1]=INF;
for (i=1; i<=nivel; i++)
{
p=start[ cd[i] ];
while(p)
{
if (best[p->val] < min(best[ cd[i] ], c[ cd[i] ][ p->val ] ))
{
best[p->val]=min(best[cd[i]], c[cd[i]][p->val]);
last[p->val]=cd[i];
if (!sel[p->val])
{
sel[p->val]=1;
++nivel;
cd[nivel]=p->val;
}
}
p=p->adr;
}
}
return best[n];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int i, a, b, cost, nod, nod2, f, flux=0;
scanf("%d %d", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%d %d %d", &a, &b, &cost);
c[a][b]=cost;
add(a, b);
add(b, a);
}
do
{
f=drum();
nod=n;
while (last[nod])
{
nod2=last[nod];
c[nod2][nod]-=f;
c[nod][nod2]+=f;
nod=nod2;
}
flux+=f;
} while(f);
printf("%d", flux);
fclose(stdout);
return 0;
}