Pagini recente » Cod sursa (job #702680) | Cod sursa (job #1097427) | Cod sursa (job #2157988) | Cod sursa (job #1016318) | Cod sursa (job #3223760)
#include <bits/stdc++.h>
std::ifstream cin("fmcm.in");
std::ofstream cout("fmcm.out");
long long n,m,s,d,ans,x,y,z,t;
long long c[360][360],f[360][360],cost[360][360],val[360],newval[360],ant[360];
std::vector<std::vector<std::pair<long long,long long>>>a;
void belman(long long nod)
{
std::queue<std::pair<long long,long long>>q;
val[nod]=0;
q.push({nod,0});
while(!q.empty())
{
nod=q.front().first;
long long cost=q.front().second;
q.pop();
if(cost>val[nod])
continue;
for(auto x:a[nod])
if(c[nod][x.first]&&cost+x.second<val[x.first])
{
val[x.first]=cost+x.second;
q.push({x.first,cost+x.second});
}
}
}
bool viz[360];
bool drum()
{
for(long long i=1;i<=n;++i)
{
newval[i]=1000000000;
viz[i]=ant[i]=0;
}
newval[s]=0;
std::priority_queue<std::pair<long long,long long>>q;
q.push({0,s});
while(!q.empty())
{
long long nod=q.top().second,cost=-q.top().first;
q.pop();
if(viz[nod]==true)
continue;
viz[nod]=true;
if(nod==d)
return true;
for(auto x:a[nod])
if(c[nod][x.first]!=f[nod][x.first]&&cost+x.second+val[nod]-val[x.first]<newval[x.first])
{
newval[x.first]=cost+x.second+val[nod]-val[x.first];
ant[x.first]=nod;
q.push({-newval[x.first],x.first});
}
}
return false;
}
void flux()
{
while(drum())
{
long long fl=1000000000,dr=0;
for(long long cop=d;cop!=s;cop=ant[cop])
{
dr+=cost[ant[cop]][cop];
fl=std::min(fl,c[ant[cop]][cop]-f[ant[cop]][cop]);
}
for(long long cop=d;cop!=s;cop=ant[cop])
{
val[cop]=dr;
dr-=cost[ant[cop]][cop];
f[ant[cop]][cop]+=fl;
ans+=fl*cost[ant[cop]][cop];
}
}
}
int main()
{
cin>>n>>m>>s>>d;
a.resize(n+5);
for(long long i=1;i<=n;++i)
val[i]=1000000000;
for(long long i=1;i<=m;++i)
{
cin>>x>>y>>z>>t;
a[x].push_back({y,t});
a[y].push_back({x,-t});
c[x][y]=z;
cost[x][y]=t;
cost[y][x]=-t;
}
belman(s);
flux();
cout<<ans;
return 0;
}