Cod sursa(job #780880)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 22 august 2012 17:33:49
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
#include<list>
#include<queue>
using namespace std;

const int inf=99999999;
int N,M,S,D,i,j,x,y,cap,ct,p,q,flowmin,exista_drum;
list<int> L[351];
list<int>::iterator it;
int cost[351][351],c[351][351],flux[351][351],t[351];
int dist[351];
queue<int> Q;

int BellmanFord()
{for(i=1; i<=N; i++)  
   {dist[i]=inf;
    t[i]=-1;}
 dist[S]=0;
 Q.push(S); 
 while(!Q.empty())
 {p=Q.front();
  Q.pop();
  for(it=L[p].begin(); it!=L[p].end(); it++)
    {q=*it;
     if(c[p][q]-flux[p][q]>0 && cost[p][q]+dist[p]<dist[q])
         {dist[q]=cost[p][q]+dist[p];
          t[q]=p;
          Q.push(q);}
     }
  }
  
 if(dist[D]!=inf)
 {j=D;
  flowmin=inf;
  exista_drum=1;
  while(j!=S) 
    {i=t[j];
     if(flowmin>c[i][j]-flux[i][j])    
         flowmin=c[i][j]-flux[i][j];
     j=t[j];}
  
  j=D;
  while(j!=S) 
    {i=t[j];
     flux[i][j]+=flowmin;
     flux[j][i]-=flowmin;
     j=t[j];}
  
  return flowmin*dist[D];
  }
 return 0; 
}

long long Flux()
{long long rezultat=0;
exista_drum=1;
int nr=10;
while(exista_drum)
{exista_drum=0;
rezultat+=BellmanFord();
nr--;}
return rezultat;}

int main()
{freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);

scanf("%d %d %d %d ", &N, &M, &S, &D);

for (i = 1; i <= M; i++)
{scanf("%d %d %d %d ",&x,&y,&cap,&ct);
L[x].push_back(y); 
L[y].push_back(x);
c[x][y] = cap;
cost[x][y] = ct;
cost[y][x] = -ct;}

//BellmanFord();

/*for(i=1; i<=N; i++)
 printf("%d ",dist[i]);
printf("\n\n\n");
for(i=1; i<=N; i++)
 {for(j=1; j<=N; j++)
  printf("%d ",cost[i][j]);
 printf("\n");} */

printf("%lld", Flux());
return 0;}