Pagini recente » Cod sursa (job #1360921) | Cod sursa (job #2238774) | Cod sursa (job #1857050) | Cod sursa (job #2041343) | Cod sursa (job #1870302)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,a,b,x,pt[1001][1001],c[1001],v[1001],fm,t[1001];//t[]=parintii, c[]=coada, pt[][]=pret/cost
struct graf
{
int nod;
struct graf *urm;
}*l[1001],*p;
void actualizare(int ns, int dt)
{
int minn=10000,aux=dt;
while(aux>ns)
{
if(pt[t[aux]][aux]<minn)
minn=t[aux];
aux=t[aux];
}
fm=fm+minn;//flux maxim
aux=dt;
while(aux>ns)
{
pt[t[aux]][aux]=pt[t[aux]][aux]-minn;
pt[aux][t[aux]]=pt[aux][t[aux]]+minn;
aux=t[aux];
}
}
int bfs(int ns,int dt)//nod start & destinatie
{
v[ns]=1;
int inc=1,sf=1,noda,ok=0;
c[sf]=ns;
for(int i=1;i<=n;i++)
v[i]=0;
while(inc<=sf)
{
noda=c[inc];
struct graf *p=l[noda];
while(p!=NULL)
{
if(v[p->nod]==0 && pt[noda][p->nod]>0)
{
t[p->nod]=noda;
if(p->nod==dt)//==n?
{
actualizare(ns,dt);
ok=1;
}
else
{
sf++;
v[p->nod]=1;
c[sf]=p->nod;
}
}
p=p->urm;
}
inc++;
}
return ok;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
f>>a>>b>>x;
pt[a][b]=x;
p=new graf;
p->nod=b;
p->urm=l[a];
l[a]=p;
p=new graf;
p->nod=a;
p->urm=l[b];
l[b]=p;
}
while(bfs(1,n))//cat timp exista drum
{}
g<<fm;
return 0;
}