Cod sursa(job #292998)

Utilizator BloodRainBurceanu Gabriel BloodRain Data 31 martie 2009 21:06:11
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 4.65 kb
#include<stdio.h>   
#include<iostream>
#define NMAX 1001
int a[NMAX][NMAX],f[NMAX][NMAX],mm[NMAX][NMAX];
struct coada{int nod,tata;}c[NMAX];
int p,i,j,u,tz,nod,n,m,t,minim,fluxMaxim;
int viz[NMAX],grad[NMAX];
int bfs()
    {
    memset(viz, 0, (n+1)*sizeof(int)); 
    p=u=1;
    c[p].nod=1;
    c[p].tata=0;
    viz[1]=0;
    int pe=0;
    while(p<=u)
        {
        nod=c[p].nod;
        for(int te=1;te<=grad[nod];te++)
            {
            i=mm[nod][te];
            if(viz[i]==0&&(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;
                    viz[i]=1;
                    //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;
                                if(tz==0)break;
                                }     
                            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");    */
                            pe=1;
                            }    
                        }
                    }
            } 
        p++;
        }          /*     
    for(i=1;i<=n;i++)
        {
        for(j=1;j<=n;j++)
            {
            printf("%d ",f[i][j]);
            }
        printf("\n");
        }    */   
     return pe;    
    }
int main(void)
{
freopen("maxflow.in","r",stdin);
//freopen("maxflow10.out","w",stdout);
scanf("%d%d",&n,&m);
int t,p,u;
for(int i=1;i<=m;i++)
    {
    scanf("%d%d%d",&t,&p,&u);
    a[t][p]=u;
    grad[t]++;
    mm[t][grad[t]]=p;
    grad[p]++;
    mm[p][grad[p]]=t;
    }
//int c=0;
while(bfs())
    {                                 /*
    c++;                             
    if(c%100==0)
        printf("%d\n",fluxMaxim);  */ 
    }           
      
freopen("maxflow.out","w",stdout);
printf("%d\n",fluxMaxim);
fclose(stdin);
fclose(stdout);
return 0;  
}