Pagini recente » Cod sursa (job #496306) | Cod sursa (job #2987922) | Cod sursa (job #3198371) | Cod sursa (job #1355775) | Cod sursa (job #2403137)
#include <bits/stdc++.h>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
int pr[352],c[352][352],a[352][352],d[2][352],cst[352],n,S,D;
vector<int> v[352];
queue<int> q;
priority_queue<pair<int,int>> h;
bool dij(int k)
{
int nr1,nr2;
memset(pr,0,sizeof(pr));
memset(cst,0,sizeof(cst));
h.push({-1,S});
cst[S]=1;
d[1-k][S]=0;
while(!h.empty())
{
nr1=h.top().first;nr2=h.top().second;
cst[nr2]=-nr1;
for(auto it:v[nr2])
if(c[nr2][it]&&(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]<-cst[it]||!cst[it]))
{
cst[it]=-(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]);
d[1-k][it]=d[1-k][nr2]+a[nr2][it];
pr[it]=nr2;
h.push({cst[it],it});
}
while(!h.empty()&&h.top().first!=cst[h.top().second])
h.pop();
}
return cst[D];
}
int main()
{
int m,nr1,nr2,nr,i;
in>>n>>m>>S>>D;
while(m--)
{
in>>nr1>>nr2;
v[nr1].push_back(nr2);
v[nr2].push_back(nr1);
in>>c[nr1][nr2]>>a[nr1][nr2];
a[nr2][nr1]=-a[nr1][nr2];
}
q.push(S);
for(i=1;i<=n;i++)
d[1][i]=1<<29;
d[1][S]=0;
while(!q.empty())
{
nr=q.front();
q.pop();
for(auto it:v[nr])
{
if(c[nr][it]&&d[1][nr]+a[nr][it]<d[1][it])
{
d[1][it]=d[1][nr]+a[nr][it];
if(!pr[it])
pr[it]=1,q.push(it);
}
}
pr[nr]=0;
}
nr=nr2=m=0;
while(dij(nr2=1-nr2))
{
for(nr1=1<<29,i=D;i!=S;i=pr[i])
nr1=min(nr1,c[pr[i]][i]);
m+=nr1*d[1-nr2][D];
for(i=D;i!=S;i=pr[i])
c[pr[i]][i]-=nr1,c[i][pr[i]]+=nr1;
}
out<<m;
return 0;
}