Cod sursa(job #630207)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 4 noiembrie 2011 21:57:25
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#define nd 1001
#define inf 1999999999
struct nod { int val; nod *urm;}*p[nd];
nod *aux;
int tata[nd],cap[nd][nd],flux[nd][nd],n;
int bfs()
{ int v,x,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];
        aux=p[c[pr]];
        while(aux!=NULL)
            {
                x=aux->val;
                if(viz[x]==0)
                    {
                        if(cap[v][x]>flux[v][x]) { u++; c[u]=x; tata[x]=v; viz[x]=1; }
                    }
            aux=aux->urm;
            }
        pr++;
    }
if(tata[n]!=0)return 1;
    else return 0;
}
int main()
{ int x2,x1,c1,i,maxflow,m,min;
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);
        aux=new nod; aux->val=x2; aux->urm=p[x1]; p[x1]=aux;
        cap[x1][x2]=c1;
        flux[x1][x2]=0;
    }
maxflow=0;
while(bfs()==1)
    {   min=inf;
        for(i=n;i!=1;i=tata[i])
            {
                if(cap[tata[i]][i]-flux[tata[i]][i]<min)min=cap[tata[i]][i]-flux[tata[i]][i];
            }
        for(i=n;i!=1;i=tata[i])
            flux[tata[i]][i]+=min;
        maxflow+=min;
    }
printf("%d",maxflow);
fclose(stdin);
fclose(stdout);
return 0;
}