Pagini recente » Cod sursa (job #1893758) | Cod sursa (job #1494436) | Cod sursa (job #1354084) | Cod sursa (job #2778787) | Cod sursa (job #407460)
Cod sursa(job #407460)
//flux maxim
#include <stdio.h>
#define size 1<<10
#define infinit 110011
#define min(a,b) a<b?a:b
using namespace std;
struct nod
{
int inf;
nod * next;
}*V[size];
int n,m,nr;
int C[size][size],F[size][size];
int Tati[size],sir[size];
int Flux;
void add(nod *&a,int i)
{
nod *q=new nod;
q->inf=i;
q->next=a;
a=q;
}
void citire()
{
int a,b,c;
scanf ("%d %d",&n,&m);
for (int i=0;i<m;i++)
{
scanf ("%d %d %d",&a,&b,&c);
C[a][b]=c;
add(V[a],b);
add(V[b],a);
}
}
int verif()
{
for (int i=2;i<=n;Tati[i++]=0);
Tati[1]=-1;
sir[(nr=0)++]=1;
for (int i=0;i<nr;i++)
for (nod *q=V[sir[i]];q;q=q->next)
{
if (Tati[q->inf] || C[sir[i]][q->inf]<=F[sir[i]][q->inf])
continue;
Tati[q->inf]=sir[i];
sir[nr++]=q->inf;
if (q->inf==n)
return 1;
}
return 0;
}
void solve()
{
int nod,fl;
while (verif())
{
for (int i=1;i<=n;i++)
{
if (Tati[i]==0 || C[i][n]<=F[i][n])
continue;
nod=i;
fl=C[i][n]-F[i][n];
while (nod!=1)
{
fl=min(fl,C[Tati[nod]][nod]-F[Tati[nod]][nod]);
nod=Tati[nod];
}
if (!fl)
continue;
Flux+=fl;
F[i][n]+=fl;
F[n][i]-=fl;
nod=i;
while (nod!=1)
{
F[nod][Tati[nod]]-=fl;
F[Tati[nod]][nod]+=fl;
nod=Tati[nod];
}
}
}
printf("%d\n", Flux);
}
int main ()
{
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
citire();
solve();
return 0;
}