Cod sursa(job #430986)

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

using namespace std;

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

vector<int> G[NM];
int C[NM][NM],F[NM][NM],FAT[NM];

char viz[NM];
int cd[NM],N,M;

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 flux=0,a,b,c;
    
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    while(M--)
    {
         scanf("%d %d %d",&a,&b,&c);
         G[a].PB(b);
         G[b].PB(a);
         C[a][b]+=c;     
    }
    
    while(DF())
    {
         int pump=inf;      
         int nod=N;
         
         while(FAT[nod])
         {
              int tata=FAT[nod];          
              pump=min(pump,C[tata][nod]-F[tata][nod]);          
              nod=tata;
         }
         
         flux+=pump;
         
         nod=N;
         
         while(FAT[nod])
         {
              int tata=FAT[nod];
              F[tata][nod]+=pump;
              F[nod][tata]-=pump;
              nod=tata;          
         }
    }
    
    printf("%d",flux);
    
    return 0;
}