Cod sursa(job #287462)

Utilizator BloodRainBurceanu Gabriel BloodRain Data 24 martie 2009 21:31:16
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.68 kb
#include<stdio.h>    
#define NMAX 1001
int a[NMAX][NMAX],f[NMAX][NMAX];
struct coada{int nod,tata;}c[1000001];
int p,i,j,u,tz,nod,n,m,t,minim,fluxMaxim;
int main(void)
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
    {
    scanf("%d%d%d",&t,&p,&u);
    a[t][p]=u;
    }

p=u=1;
c[p].nod=1;
c[p].tata=0;
while(p<=u)
    {
    nod=c[p].nod;
    for(i=1;i<=n;i++)
        {
        if(i!=c[c[p].tata].nod&&((a[nod][i]>f[nod][i])||(f[i][nod]>0)))
                {
                //if(i==2&&nod==)

                u++;
                c[u].nod=i;
                c[u].tata=p;
                //printf("%d ",i);          
                
                                   /*
               t=u;           
                while(c[t].tata!=0)
                        {
                        printf("(%d,%d) ",c[c[t].tata].nod,c[t].nod);
                        t=c[t].tata;
                        } 
                printf("\n");    */
                if(i==n)
                    {
                   // printf("Am ajuns in 7 baaaa !");
                    t=u;
                    minim=12000000;
                    while(c[t].tata!=0)
                        {
                        if(a[c[c[t].tata].nod][c[t].nod]>0)
                            {
                            tz=a[c[c[t].tata].nod][c[t].nod]-f[c[c[t].tata].nod][c[t].nod];
                           // if(tz==0)   
                           //     printf("muchie pozitiva : %d -> %d ",c[c[t].tata].nod, c[t].nod);
                            }
                        else if(a[c[t].nod][c[c[t].tata].nod]>0)
                            {
                            tz=f[c[t].nod][c[c[t].tata].nod];
                           /* if(tz==0)   
                                printf("muchie negativa : %d -> %d ",c[t].nod,c[c[t].tata].nod);
                            */
                            }
                        
                        if(minim>tz)
                            {
                            minim=tz;
                            }     
                        t=c[t].tata;
                        }
                    if(minim>0)
                        {
                        fluxMaxim+=minim;
                        //printf(" MINIM : %d   \n  ",minim);
                        t=u;
                        while(c[t].tata!=0)
                            {
                            if(a[c[c[t].tata].nod][c[t].nod]>0)
                                {    
                                f[c[c[t].tata].nod][c[t].nod]+=minim;
                                }
                            else if(a[c[t].nod][c[c[t].tata].nod]>0)
                                {
                                f[c[t].nod][c[c[t].tata].nod]-=minim;
                                }
                            //printf("(%d,%d) ",c[t].nod,c[c[t].tata].nod);
                            t=c[t].tata;
                            }            
                            //printf("\n");
                            /*
                            for(j=1;j<=n;j++)
                                {
                                printf("%d ",viz[j]);
                                }
                            printf("\n");    */
                        }
                    break;    
                    }
                }
        } 
    p++;
    }          /*     
for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
        {
        printf("%d ",f[i][j]);
        }
    printf("\n");
    }    */                    
printf("%d\n",fluxMaxim);
fclose(stdin);
fclose(stdout);
return 0;  
}