Pagini recente » Cod sursa (job #957104) | Cod sursa (job #1327570) | Cod sursa (job #2329433) | Cod sursa (job #488281) | Cod sursa (job #296477)
Cod sursa(job #296477)
#include<stdio.h>
#include<string.h>
#include<values.h>
FILE*f=fopen("maxflow.in","r");
FILE*g=fopen("maxflow.out","w");
int n,m,s,d,coada[1001],viz[1001],gre[1001],gri[1001];
long fl[1001][1001],F,c[1001][1001];
void citire()
{
int i,x,y,C;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(f,"%d%d%d",&x,&y,&C);
c[x][y]=C;
gre[x]++;
gri[y]++;
}
for(i=1;i<=n;i++)
{
if(gre[i]==0) d=i;
if(gri[i]==0) s=i;
}
}
long minim(long x,long y)
{
if(x<y) return x;
return y;
}
int bf()
{
int p,u,x,i;
p=u=1;
coada[p]=s;
memset(viz,0,sizeof(viz));
viz[s]=1;
while(p<=u)
{
x=coada[p++];
for(i=1;i<=n;i++)
if(!viz[i]) if(fl[x][i]<c[x][i]) {
viz[i]=x;
coada[++u]=i;
}
else if(fl[i][x]>0) {
viz[i]=-x;
coada[++u]=i;
}
}
return viz[d];
}
void ek()
{
int i,l[101],lg,v;
long a,b;
a=b=MAXLONG;
do {
if(!bf()) return;
l[0]=d;lg=0;
while(l[lg]!=s)
{
++lg;
if(viz[l[lg-1]]>0) l[lg]=viz[l[lg-1]];
else if(viz[l[lg-1]]<0) l[lg]=-viz[l[lg-1]];
if(viz[l[lg-1]]>0)
a=minim(a,c[l[lg]][l[lg-1]]-fl[l[lg]][l[lg-1]]);
else if(viz[l[lg-1]]<0)
b=minim(b,fl[l[lg-1]][l[lg]]);
}
v=minim(a,b);
for(i=lg;i>=1;i--)
if(viz[l[i-1]]>0) fl[l[i]][l[i-1]]+=v;
else fl[l[i-1]][l[i]]-=v;
}
while(1);
}
int main()
{
int i;
citire();
ek();
for(i=1;i<=n;i++)
F+=fl[i][d];
fprintf(g,"%ld",F);
fcloseall();
return 0;
}