Pagini recente » Cod sursa (job #1870915) | Cod sursa (job #3221571) | Cod sursa (job #1916362) | Cod sursa (job #1082973) | Cod sursa (job #610032)
Cod sursa(job #610032)
#include<cstdio>
#include<vector>
#include<deque>
#define M 25010
#define N 351
using namespace std;
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,bellman(),oo=2000000000;
vector<int> v[N];
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(;m;m--)
{
scanf("%d%d%d%d",&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);
}
for(;bellman();)
upd();
printf("%d\n",PRICE);
return 0;
}
int bellman()
{
for(i=1;i<=n;i++)P[i]=oo;P[s]=0;dad[s]=s;dad[d]=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[m][*it]-flow[m][*it]>0&&P[*it]>P[m]+price[m][*it])
{
if(!q[*it]){q[*it]=1;Q.push_back(*it);}
dad[*it]=m;
P[*it]=P[m]+price[m][*it];
}
Q.pop_front();q[m]=0;
}
if(!dad[d])return 0;
return 1;
}
void upd()
{
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*P[d];
for(i=d,j=dad[d];i-j;i=dad[i],j=dad[j])
{
flow[i][j]-=m;
flow[j][i]+=m;
}
}