Cod sursa(job #630217)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 4 noiembrie 2011 22:23:38
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#define nd 1001
#define inf 1999999999
int tata[nd],cap[nd][nd],flux[nd][nd],n,min;
int bfs()
{ int v,pr,u,c[nd],viz[nd],i;
for(i=1;i<=n;i++)
    viz[i]=tata[i]=0;
pr=u=1;
c[pr]=1;
while(pr<=u)
    {
        v=c[pr];
        for(i=1;i<=n;i++)
                if(viz[i]==0)
                    {
                        if(cap[v][i]>flux[v][i]) { u++; c[u]=i; tata[i]=v; viz[i]=1;

                                                 }
                    }
        pr++;
    }
if(tata[n]!=0)return 1;
    else return 0;
}
int main()
{ int x2,x1,c1,i,maxflow,m,min,j;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1;i<=m;i++)
    {
        scanf("%d %d %d\n",&x1,&x2,&c1);
        cap[x1][x2]=c1;
        flux[x1][x2]=0;
    }
maxflow=0;
while(bfs()==1)
    {
        for(i=1;i<n;i++)
            if(cap[i][n]-flux[i][n]>0)
                {
                    min=inf;
                    for(j=i;j!=1;j=tata[j])
                        if(cap[tata[j]][j]-flux[tata[j]][j]<min)min=cap[tata[j]][j]-flux[tata[j]][j];

                if(min!=inf)
                    {
                        flux[i][n]+=min;
                        flux[n][i]-=min;
                        for(j=i;j!=1;j=tata[j])
                            {
                                flux[tata[j]][j]+=min;
                                flux[j][tata[j]]-=min;
                            }
                    }
                maxflow+=min;
                }

    }
printf("%d",maxflow);
fclose(stdin);
fclose(stdout);
return 0;
}