Pagini recente » Cod sursa (job #197407) | Cod sursa (job #1219177) | Cod sursa (job #613081) | Cod sursa (job #2570426) | Cod sursa (job #380362)
Cod sursa(job #380362)
#include<fstream.h>
struct nod { int info; nod * next;} ;
int suma,k,u,n,m,sw[1007],smax,min,C[1007],cap[1005][1005],flux[1005][1005],viz[1005],t[1005],inf=1000000000;
nod *v[1007],*p;
int max()
{
int i;
k=u=1;
C[k]=1;
memset(viz,0,sizeof(viz));
memset(sw,0,sizeof(sw));
viz[1]=1;
t[1]=0;
while (k<=u )
{
for (p=v[C[k]];p;p=p->next)
if ((viz[p->info]==0) && (cap[C[k]][p->info]-flux[C[k]][p->info]>0))
{
if (p->info!=n)
{
t[p->info]=C[k];
C[++u]=p->info;
viz[p->info]=1;
}
else sw[C[k]]=1;
}
k++;
}
suma=0;
for (i=1;i<=n;i++)
if (sw[i]==1)
{
smax=inf;k=u=n;
t[n]=i;
while(t[u]>0)
{
min=cap[t[u]][u]-flux[t[u]][u];
if (min<smax) smax=min;
u=t[u];
}
while(t[k]>0)
{
flux[t[k]][k]+=smax;
flux[k][t[k]]-=smax;
k=t[k];
}
if (smax<inf) suma+=smax;
}
return suma;
}
int maxflow()
{
int s=0,x=1;
while (x)
{
x=max();
s+=x;
}
return s;
}
void citire()
{
int i,x1,x2,x3;
nod *p;
ifstream f("maxflow.in");
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x1>>x2>>x3;
p=new nod;
p->info=x2;
p->next=v[x1];
v[x1]=p;
cap[x1][x2]=x3;
p=new nod;
p->info=x1;
p->next=v[x2];
v[x2]=p;
}
f.close();
}
int main()
{
citire();
ofstream g("maxflow.out");
g<<maxflow();
g.close();
return 0;
}