Pagini recente » Cod sursa (job #232914) | Istoria paginii runda/test_11 | Istoria paginii utilizator/perjuioana | Cod sursa (job #490967) | Cod sursa (job #1571828)
#include<fstream>
#include<string.h>
#define Nmax 1005
#define INF 999999999
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int F[Nmax][Nmax],C[Nmax][Nmax],T[Nmax],n,m,flux=0,s,d;
struct lista{int nod; lista *leg;} *G[Nmax];
bool U[Nmax];
void adaug(int i,int j)
{
lista *p;
p=new lista;
p->nod=j;
p->leg=G[i];
G[i]=p;
}
void citire()
{
f>>n>>m;
s=1; d=n;
int i,j,a;
while(m--)
{
f>>i>>j>>a;
C[i][j]=a;
adaug(i,j);
adaug(j,i);
}
}
int BF(int s,int d)
{
int p,u,nod,Q[Nmax];
lista *q;
memset(T,0,sizeof T);
memset(U,0,sizeof U);
p=u=1;
Q[p]=s;
T[s]=-1;
U[s]=1;
for(p=1;p<=u;++p)
{
nod=Q[p];
if(nod==d) continue;
for(q=G[nod];q;q=q->leg)
{
int i=q->nod;
if(!T[i]&&C[nod][i]>F[nod][i]&&!U[i])
{
Q[++u]=i;
T[i]=nod;
U[i]=1;
if(i==d) return 1;
}
}
}
return 0;
}
void flux_max()
{
int i,r;
for(flux=0;BF(s,d);)
{
for(lista *p=G[d];p;p=p->leg)
{
if(!U[p->nod]) continue;
T[d]=p->nod;
r=INF;
i=d;
while(i-s)
{
r=min(r,C[T[i]][i]-F[T[i]][i]);
i=T[i];
}
i=d;
while(i-s)
{
F[T[i]][i]+=r;
F[i][T[i]]-=r;
i=T[i];
}
flux+=r;
}
}
}
int main()
{
citire();
flux_max();
g<<flux<<'\n';
return 0;
}