Cod sursa(job #431013)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 31 martie 2010 15:55:03
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<iostream>
#include<string>
#include<vector>

using namespace std;

#define PB push_back
#define NM 1005
#define inf 1000000000

int C[NM][NM],F[NM][NM],FAT[NM],cd[NM],N,M;
char viz[NM];

vector<int> G[NM];

int DF()
{
    for(int i=1;i<=N;++i)
       viz[i]=0;
    
    cd[0]=1;
    cd[1]=1;
    viz[1]=1;
    
    for(int i=1;i<=cd[0];++i)
    {
        int nod=cd[i];
        
        for(int j=0;j<G[nod].size();++j)
        {
            int nnod=G[nod][j];    
            if(viz[nnod]) continue;
            if(C[nod][nnod]-F[nod][nnod]<=0) continue;
            
            cd[++cd[0]]=nnod;
            FAT[nnod]=nod;
            viz[nnod]=1;    
        }    
    }   
    
    if(viz[N]) return 1;
    return 0;
}

int main()
{
    int a,b,c;
    
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    for(int i=1;i<=M;++i)
    {
        scanf("%d %d %d",&a,&b,&c);
        
        G[a].PB(b);
        G[b].PB(a);
        
        C[a][b]+=c;    
    }
    
    int flux=0;
    
    while(DF())
    {
         for(int j=0;j<G[N].size();++j)
         {
             FAT[N]=G[N][j];
             
             int nod=N;
             int pump=inf;
             
             while(FAT[nod])
             {
                 int fat=FAT[nod];
                 
                 pump=min(pump,C[fat][nod]-F[fat][nod]);
                 if(!pump) break;           
                 
                 nod=fat;
             }
             
             if(!pump) continue;
             
             nod=N;
             
             while(FAT[nod])
             {
                 int fat=FAT[nod];
                 
                 F[fat][nod]+=pump;
                 F[nod][fat]-=pump;
                 
                 nod=fat;
             }    
             
             flux+=pump;         
         }      
    }
    
    printf("%d",flux);
    
    return 0;
}