Pagini recente » Cod sursa (job #1371519) | Cod sursa (job #673091) | Cod sursa (job #547841) | Cod sursa (job #683448) | Cod sursa (job #1962418)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector <int> G[351];
vector <int> ::iterator IT;
queue <int> bf;
priority_queue<pair<int,int> > dj;
int mCost[351][351],mCapacitate[351][351],vDist[351],vDistN[351],vTati[351],vDistR[351];
int n,m,s,d;
int F,Fcst;
void citire()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
int x,y,cost,capacitate;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d%d",&x,&y,&capacitate,&cost);
G[x].push_back(y);
G[y].push_back(x);
mCost[x][y]=cost;
mCost[y][x]=-cost;
mCapacitate[x][y]=capacitate;
mCapacitate[y][x]=0;
}
}
void init(int lungime, int vect[],int val)
{
for(int i=1; i<=lungime; i++)
vect[i]=val;
}
bool belmanford()
{
init(n,vDist,0x3f3f3f3f);
vDist[s]=0;
bf.push(s);
int nod;
while(!bf.empty())
{
nod=bf.front();
bf.pop();
for(IT=G[nod].begin(); IT!=G[nod].end(); IT++)
if(vDist[*IT]>vDist[nod]+mCost[nod][*IT])
{
vDist[*IT]=vDist[nod]+mCost[nod][*IT];
bf.push(*IT);
}
}
if(vDist[d]==0x3f3f3f3f)
return false;
return true;
}
bool dijkstra()
{
init(n,vDistN,0x3f3f3f3f);
vDistN[s]=0;
dj.push(make_pair(0,s));
int nod,dist,new_D;
while(!dj.empty())
{
nod=dj.top().second;
dist=-dj.top().first;
if(vDistN[nod]!=dist)
continue;
for(IT=G[nod].begin(); IT!=G[nod].end(); IT++)
if(mCapacitate[nod][*IT])
{
new_D=vDistN[nod]+vDist[nod]+mCost[nod][*IT]-vDist[*IT];
if(vDistN[*IT]>new_D)
{
vDistN[*IT]=new_D;
vTati[*IT]=nod;
vDistR[*IT]=vDistR[nod]+mCost[nod][*IT];
dj.push(make_pair(-vDistN[*IT],*IT));
}
}
}
for(int i=1;i<=n;i++)
vDistR[i]=vDist[i];
if(vDistN[d]==0x3f3f3f3f)
return false;
int minim=0x3f3f3f3f, costCurent=0;
for(int aux=d; aux!=s; aux=vTati[aux])
{
minim=min(minim,mCapacitate[vTati[aux]][aux]);
costCurent+=mCost[vTati[aux]][aux];
}
F+=minim;
Fcst+=minim*vDistR[d];
for(int aux=d; aux!=s; aux=vTati[aux])
{
mCapacitate[vTati[aux]][aux]-=minim;
mCapacitate[aux][vTati[aux]]+=minim;
}
return true;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
citire();
F=Fcst=0;
belmanford();
while(dijkstra());
printf("%d",Fcst);
return 0;
}