Pagini recente » Cod sursa (job #2319291) | Cod sursa (job #3137552) | Cod sursa (job #1977494) | Cod sursa (job #3173727) | Cod sursa (job #2897180)
#include <bits/stdc++.h>
using namespace std;
vector <int> v[351];
int cap[351][351],cost[351][351],n,dist[351],s,d,S,D;
bool incoada[351];
int daddy[351];
priority_queue <pair<int,int>> pq;
pair <int,int> dijkstra()
{
int i;
for(i=1; i<=n; i++)
dist[i]=1e9;
dist[s]=0;
pq.push({0,s});
incoada[s]=1;
int cst=0,flow=1e9;
while(pq.size())
{
int x=pq.top().second;
incoada[x]=0;
pq.pop();
for(auto it:v[x])
if(cap[x][it]&&dist[it]>dist[x]+cost[x][it])
{
dist[it]=dist[x]+cost[x][it];
daddy[it]=x;
pq.push({-dist[it],it});
}
}
for(i=d; i!=s; i=daddy[i])
flow=min(flow,cap[daddy[i]][i]);
for(i=d; i!=s; i=daddy[i])
{
cap[daddy[i]][i]-=flow;
cap[i][daddy[i]]+=flow;
}
cst=flow*(dist[d]-S+D);
return {flow,cst};
}
queue <int> q;
void bellman()
{
for(int i=1; i<=n; i++)
dist[i]=1e9;
dist[s]=0;
q.push(s);
incoada[s]=1;
while(q.size())
{
int x=q.front();
incoada[x]=0;
q.pop();
for(auto it:v[x])
if(cap[x][it]&&dist[it]>dist[x]+cost[x][it])
{
dist[it]=dist[x]+cost[x][it];
if(!incoada[it])
{
incoada[it]=1;
q.push(it);
}
}
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
int m,i,a,b,c,k,j;
cin>>n>>m>>s>>d;
for(i=1; i<=m; i++)
{
cin>>a>>b>>c>>k;
cost[a][b]=k;
cost[b][a]=-k;
cap[a][b]=c;
v[a].push_back(b);
v[b].push_back(a);
}
bellman();
//for(i=1;i<=n;i++)
//cout<<dist[i]<<" ";
//cout<<'\n';
S=dist[s];
D=dist[d];
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
cost[i][j]=cost[i][j]+dist[i]-dist[j];
pair <int,int> x;
int cost=0,flow=0;
do
{
x=dijkstra();
flow+=x.first;
cost+=x.second;
}
while(x!= make_pair(0,0));
cout<<cost;
return 0;
}