Pagini recente » Cod sursa (job #2887026) | Cod sursa (job #755991) | Cod sursa (job #1246061) | Cod sursa (job #1546286) | Cod sursa (job #3197517)
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
vector<int>G[408];
int incoada[408],viz[408],cap[408][408],cost[408][408],tata[408],distaux[408],dist[408],s,d,cst,n,m,i,a,b,c,k,ok;
void bellman()
{
int i;
for(i=1; i<=n; i++)
dist[i]=2e9;
dist[s]=0;
queue<int>Q;
Q.push(s);
incoada[s]=1;
while(!Q.empty())
{
int x=Q.front();
incoada[x]=0;
Q.pop();
for(auto j:G[x])
if(cap[x][j]&&dist[j]>dist[x]+cost[x][j])
{
dist[j]=dist[x]+cost[x][j];
if(!incoada[j])
{
incoada[j]=1;
Q.push(j);
}
}
}
}
long long int dijkstra()
{
int i;
for(i=1; i<=n; i++)
{
distaux[i]=dist[i];
dist[i]=2e9;
}
dist[s]=0;
priority_queue<pair<int,int>>Q;
Q.push({0,s});
while(!Q.empty())
{
int k=Q.top().second;
Q.pop();
if(viz[k]==0)
{
viz[k]=1;
for(auto j:G[k])
if(cap[k][j]>0 && dist[j]>dist[k]+cost[k][j]+distaux[k]-distaux[j])
{
dist[j]=dist[k]+cost[k][j]+distaux[k]-distaux[j];
tata[j]=k;
Q.push({-dist[j],j});
}
}
}
for(i=1;i<=n;i++)
viz[i]=0;
if(dist[d]!=2e9)
{
int fluxmin=2e9;
ok=1;
for(i=1;i<=n;i++)
dist[i]+=distaux[i];
for(i=d;i!=s;i=tata[i])
fluxmin=min(fluxmin,cap[tata[i]][i]);
for(i=d;i!=s;i=tata[i])
{
cap[tata[i]][i]-=fluxmin;
cap[i][tata[i]]+=fluxmin;
}
return fluxmin*dist[d];
}
return 0;
}
long long int Flux()
{
bellman();
long long int ras=0;
ok=1;
while(ok==1)
{
ok=0;
ras+=dijkstra();
}
return ras;
}
int main()
{
cin>>n>>m>>s>>d;
for(i=1; i<=m; i++)
{
cin>>a>>b>>c>>k;
cap[a][b]=c;
cost[a][b]=k;
cost[b][a]=-k;
G[a].push_back(b);
G[b].push_back(a);
}
cout<<Flux();
return 0;
}