Pagini recente » Cod sursa (job #3164910) | Cod sursa (job #1509555) | Cod sursa (job #2136486) | Cod sursa (job #909884) | Cod sursa (job #2651436)
#include<bits/stdc++.h>
#define M 25010
#define N 351
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n,m,s,d,i,j,k,cp,cs,cap[N][N],flow[N][N],q[N],dad[N],P[N],price[N][N],PRICE,djikstra(),LH,H[N],PH[N],oo=2000000000;
vector<int> v[N];
void upd(),bellman();
int main()
{
f>>n>>m>>s>>d;
for(;m;m--)
{
int i,j,cp,cs;
f>>i>>j>>cp>>cs;
cap[i][j]=cp;
price[i][j]=cs;
price[j][i]=-cs;
v[i].push_back(j);
v[j].push_back(i);
}
bellman();
for(;djikstra();)
upd();
g<<PRICE;
return 0;
}
void bellman()
{
for(i=1;i<=n;i++)
P[i]=oo;
P[s]=0;
dad[s]=s;
dad[d]=0;
queue<int> Q;
Q.push(s);
q[s]=1;
for(;Q.size();)
{
int nod=Q.front();
Q.pop();q[m]=0;
for(auto vec:v[nod])
if(cap[nod][vec]-flow[nod][vec]>0&&P[vec]>P[nod]+price[nod][vec])
{
if(!q[vec])
{
q[vec]=1;
Q.push(vec);
}
dad[vec]=nod;
P[vec]=P[nod]+price[nod][vec];
}
}
cs=P[d];
}
int djikstra()
{
for(i=1;i<=n;i++)
{
if(P[i]==oo)continue;
for(auto vec:v[i])
{
if(P[vec]==oo)continue;
price[i][vec]+=P[i]-P[vec];
}
}
for(i=1;i<=n;i++)
{
P[i]=oo;
dad[i]=i;
}
priority_queue<pair<int,int>> pq;
pq.push(make_pair(0,s));
P[s]=0;
while(pq.size())
{
int nod,cst;
tie(cst,nod)=pq.top();
pq.pop();
cst=-cst;
for(auto vec:v[nod])
if(flow[nod][vec]<cap[nod][vec])
if(P[vec]>P[nod]+price[nod][vec])
{
P[vec]=P[nod]+price[nod][vec];
pq.push(make_pair(-P[vec],vec));
dad[vec]=nod;
}
}
return P[d]==oo?0:1;
}
void upd()
{
cs+=P[d];
for(m=oo,i=d,j=dad[d];i-j;i=dad[i],j=dad[j])
m=min(m,cap[j][i]-flow[j][i]);
PRICE+=m*cs;
for(i=d,j=dad[d];i-j;i=dad[i],j=dad[j])
{
flow[i][j]-=m;
flow[j][i]+=m;
}
}