Pagini recente » Cod sursa (job #1392033) | Cod sursa (job #2361107) | Cod sursa (job #1427572) | Cod sursa (job #2460182) | Cod sursa (job #610019)
Cod sursa(job #610019)
#include<cstdio>
#include<vector>
#include<deque>
#define M 25010
#define N 351
using namespace std;
int n,m,s,d,ns,nd,cp,cs,i,k,from[M],to[M],cap[M],flow[M],q[N],way[N],price[M],PRICE,bellman(),oo=2000000000;
vector<int> v[N],P,QD,QI;
deque<int> Q;
void upd();
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",&ns,&nd,&cp,&cs);
k++;from[k]=ns;to[k]=nd;price[k]=cs;cap[k]=cp;v[ns].push_back(k);
k++;from[k]=nd;to[k]=ns;price[k]=-cs;cap[k]=0;v[nd].push_back(k);
}
for(;bellman();)upd();
printf("%d\n",PRICE);
return 0;
}
int bellman()
{
P.assign(n+1,oo);P[s]=0;
Q.resize(0);
Q.push_back(s);q[s]=1;
for(;Q.size();)
{
m=Q.front();
for(vector<int>:: iterator it=v[m].begin();it!=v[m].end();it++)
if(cap[*it]-flow[*it]>0)
if(P[to[*it]]>P[m]+price[*it])
{
if(!q[to[*it]]){q[to[*it]]=1;Q.push_back(to[*it]);}
way[to[*it]]=*it;
P[to[*it]]=P[m]+price[*it];
}
Q.pop_front();q[m]=0;
}
if(P[d]==oo)return 0;
return 1;
}
void upd()
{
int md,mi,Flow=oo;
for(nd=d;;)
{
md=way[nd];ns=from[md];
mi=md&1?md+1:md-1;
Flow=min(Flow,cap[md]-flow[md]);
QD.push_back(md);
QI.push_back(mi);
if(ns==s)break;
nd=ns;
}
PRICE+=Flow*P[d];
for(;QD.size();)
{
md=QD.back();QD.pop_back();flow[md]+=Flow;
}
for(;QI.size();)
{
mi=QI.back();QI.pop_back();flow[mi]+=Flow;
}
}