Cod sursa(job #702643)

Utilizator bacilaBacila Emilian bacila Data 2 martie 2012 01:43:12
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb

#include <queue>
#include <fstream>
#include<vector>
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
using namespace std;
vector<pair<int,pair<int,int> > > v[352];
priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int> > > > q;
int i,j,n,m,x,y,c,a[352][352],co[352][352],viz[352],s,d,tata[352],cost[352],flux,rez;
bool dij()
{for(i=1;i<=n;i++)
  {cost[i]=1<<28;
  viz[i]=false;}
  viz[s]=true;
  cost[s]=0;
  for(i=1;i<=n;i++)
  for(j=0;j<v[i].size();j++)
  v[i][j].first=co[i][v[i][j].second.first];
  
  for(i=0;i<v[s].size();i++)   
     if(a[s][v[s][i].second.first])
     {q.push(v[s][i]);
     cost[v[s][i].second.first]=v[s][i].first;}
        
  while(!q.empty())
{                
                y=q.top().second.first;
                x=q.top().second.second;
                q.pop();
               tata[y]=x;
                
                 for(i=0;i<v[y].size();i++)
                 {
                  if(a[y][v[y][i].second.first]&&cost[v[y][i].second.first]>cost[y]+v[y][i].first)
                               {cost[v[y][i].second.first]=v[y][i].first+cost[y];
                               if(viz[v[y][i].second.first]==false)
                               {v[y][i].first+=cost[y];
                               q.push(v[y][i]);
                               } 
                             
                               }
                 }
                  viz[y]=true; 
                 
}
    if(cost[d]!=1<<28)
    return true;
    else
    return false;
    }

int main ()
{ifstream f("fmcm.in");
 ofstream g("fmcm.out");
 
f>>n>>m>>s>>d;
while(m)
{
        f>>x>>y;
f>>a[x][y];
f>>c;
co[x][y]=c;
co[y][x]=-c;
v[x].pb(mp(c,mp(y,x)));
v[y].pb(mp(-c,mp(x,y)));
m--;
}
for(rez=0;dij();rez+=c)
{ 
                         x=d; flux=20000; c=0;
       while(tata[x])
       {
       if(a[tata[x]][x]<flux) flux=a[tata[x]][x];
       x=tata[x];
       }
x=d;      
        while(tata[x])
       { a[tata[x]][x]-=flux;
         a[x][tata[x]]+=flux;
       c+=flux*co[tata[x]][x];
       x=tata[x];
       
       }         
   
                        
}
g<<rez;
 f.close(); g.close();
return 0;
}