Pagini recente » Cod sursa (job #108899) | Cod sursa (job #15195) | Cod sursa (job #2984726) | Cod sursa (job #2608481) | Cod sursa (job #286248)
Cod sursa(job #286248)
#include <stdio.h>
#define N 1001
struct nod
{
int inf;
nod *next;
}*sir[N];
int T[N],cp[N][N],F[N][N],coada[N];
int flux,n,m;
void baga(int a,int b)
{
nod *q=new nod;
q->inf=a;
q->next=sir[b];
sir[b]=q;
}
void citire()
{
int a,b,f;
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
scanf ("%d %d",&n,&m);
for (int i=0;i<m;i++)
{
scanf ("%d %d %d",&a,&b,&f);
cp[a][b]=f;
baga(a,b);
baga(b,a);
}
}
int verif()
{
int nr=0;
for (int i=2;i<=n;i++)
T[i]=0;
T[1]=-1;
coada[nr++]=1;
for (int i=0;i<nr;i++)
{
for (nod *q=sir[coada[i]];q;q=q->next)
{
if (T[q->inf])
continue;
if (cp[coada[i]][q->inf]<=F[coada[i]][q->inf])
continue;
T[q->inf]=coada[i];
coada[nr++]=q->inf;
if (q->inf==n)
return 1;
}
}
return 0;
}
void solve()
{
int fl;
while (verif())
{
for (int i=1;i<=n;i++)
{
if (!T[i])
continue;
if (cp[i][n]<=F[i][n])
continue;
fl=cp[i][n]-F[i][n];
int nod=i;
while (nod!=1)
{
if (fl>cp[T[nod]][nod]-F[T[nod]][nod])
fl=cp[T[nod]][nod]-F[T[nod]][nod];
nod=T[nod];
}
if (!fl)
continue;
flux+=fl;
F[i][n]+=fl;
F[n][i]-=fl;
nod=i;
while (nod!=1)
{
F[T[nod]][nod]+=fl;
F[nod][T[nod]]-=fl;
nod=T[nod];
}
}
}
}
int main ()
{
citire();
solve();
printf("%d\n",flux);
return 0;
}