Cod sursa(job #432752)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 2 aprilie 2010 18:14:42
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include<iostream>
#include<string>
#include<vector>
#include<queue>

using namespace std;

#define NM 355
#define inf 2000000000
#define PB push_back
#define MKP make_pair

int N,M,S,D,C[NM][NM],F[NM][NM];

long long fmcm;

vector<pair<int,int> > G[NM];

queue<int> Q;

int BLF()
{
     int DMIN[NM],FAT[NM];
     char IN[NM];
     
     for(int i=0;i<=N;++i)
     {
         DMIN[i]=inf;
         IN[i]=0;
         FAT[i]=0;    
     }   
     
     DMIN[S]=0;
     IN[S]=1;
     Q.push(S);
     
     while(!Q.empty())
     {
         int nod=Q.front();
         Q.pop();
         IN[nod]=0;
         
         if(IN[FAT[nod]]) continue;
         
         for(int i=0;i<G[nod].size();++i)                      
         {
              int nnod=G[nod][i].first;
              int cost=G[nod][i].second;
              
              if(C[nod][nnod]-F[nod][nnod]<=0) continue;
              
              if(DMIN[nnod]>DMIN[nod]+cost)
              {
                  DMIN[nnod]=DMIN[nod]+cost;
                  FAT[nnod]=nod;
                  
                  if(!IN[nnod]) 
                  {
                       Q.push(nnod);
                       IN[nnod]=1;         
                  }                        
              }   
         }
     }
     
     if(DMIN[D]==inf) return 0;
     
     int nod=D,fc=inf;
     
     while(FAT[nod])
     {
         int fat=FAT[nod];           
         fc=min(fc,C[fat][nod]-F[fat][nod]);
         nod=fat;
     }
     
     fmcm+=(long long)fc*(long long)DMIN[D];
     
     nod=D;
     
     while(FAT[nod])
     {
         int fat=FAT[nod];  
         F[fat][nod]+=fc;
         F[nod][fat]-=fc;
         nod=fat;           
     }
     
     return 1; 
}

int main()
{
    int a,b,c,d;
    
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    
    scanf("%d %d %d %d",&N,&M,&S,&D);
    
    for(int i=1;i<=M;++i)
    {
        scanf("%d %d %d %d",&a,&b,&c,&d);
        
        G[a].PB(MKP(b,d));
        G[b].PB(MKP(a,-d));
        
        C[a][b]+=c;    
    }
    
    while(BLF());
    
    printf("%I64d",fmcm);
    
    return 0;
}