Cod sursa(job #702121)

Utilizator bacilaBacila Emilian bacila Data 1 martie 2012 19:44:45
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 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,flux;
bool dij()
{for(i=1;i<=n;i++)
  viz[i]=0;
  viz[s]=-1;
  for(i=0;i<v[s].size();i++)   
     if(a[s][v[s][i].second.first])
     q.push(v[s][i]);
    
  while(!q.empty())
  {
    if(!viz[q.top().second.first])
    {x=q.top().second.first;
    y=q.top().second.second;
    c=q.top().first;
    q.pop();
    viz[x]=c;
    tata[x]=y;
    for(i=0;i<v[x].size();i++)   
     if(a[x][v[x][i].second.first]&&!viz[v[x][i].second.first])
     {v[x][i].first+=c;
     q.push(v[x][i]);
      v[x][i].first-=c;
     }                             
    }               
    else
           q.pop();
                   
           }
    if(viz[d])
    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+1000,mp(y,x)));
v[y].pb(mp(-c+1000,mp(x,y)));
m--;
}
for(cost=0;dij();cost+=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<<cost;
 f.close(); g.close();
return 0;
}