Cod sursa(job #430997)

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

using namespace std;

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

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

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

FILE*fin=fopen("maxflow.in","r");

char buf[maxbuf];
int ind;

inline void refbuf()
{
    int ans=fread(buf,1,maxbuf,fin);
    if(ans<maxbuf) buf[ans]=0;
    ind=0;   
}

int readnr()
{
    int ans=0;
    
    one:
        while(ind < maxbuf && !isdigit(buf[ind])) ++ind;
        if(ind==maxbuf)
        {
             refbuf();
             goto one;          
        }
    two:
        while(ind< maxbuf && isdigit(buf[ind])) 
        {
             ans=ans*10+buf[ind]-'0';
             ++ind;      
        }   
        if(ind==maxbuf)
        {
             refbuf();
             goto two;          
        }
    return ans;    
}

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);
    
    refbuf();
    
    N=readnr();
    M=readnr();
    
    while(M--)
    {
         a=readnr();
         b=readnr();
         c=readnr();
         
         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;
}