Pagini recente » Cod sursa (job #3142211) | Cod sursa (job #591980) | Cod sursa (job #1116365) | Cod sursa (job #107194) | Cod sursa (job #2985759)
#include <fstream>
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin ("fmcm.in");
ofstream cout ("fmcm.out");
vector<int>G[1008];
int a,b,c,f,n,m,S,D,i;
int ok,cap[1008][1008],cost[1008][1008],F[1008][1008],dist[1008],tata[1008],incoada[1008];
int bellmanford()
{
for(i=1; i<=n; i++)
{
tata[i]=-1;
dist[i]=1e9;
}
dist[S]=0;
queue<int>Q;
Q.push(S);
incoada[S]=1;
while(!Q.empty())
{
int nod=Q.front();
Q.pop();
for(auto i:G[nod])
if(cap[nod][i]-F[nod][i]>0 && dist[nod]+cost[nod][i]<dist[i])
{
dist[i]=dist[nod]+cost[nod][i];
tata[i]=nod;
if(incoada[i]==0)
{
Q.push(i);
incoada[i]=1;
}
}
incoada[nod]=0;
}
if(dist[D]!=1e9)
{
int fluxul=1e9;
i=D;
while(i!=S)
{
fluxul=min(fluxul,cap[tata[i]][i]-F[tata[i]][i]);
i=tata[i];
}
i=D;
while(i!=S)
{
F[tata[i]][i]+=fluxul;
F[i][tata[i]]-=fluxul;
i=tata[i];
}
ok=1;
return fluxul*dist[D];
}
return 0;
}
int Flux()
{
int ras=0;
ok=1;
while(ok==1)
{
ok=0;
ras+=bellmanford();
}
return ras;
}
int main()
{
cin>>n>>m>>S>>D;
for(i=1; i<=m; i++)
{
cin>>a>>b>>f>>c;
G[a].push_back(b);
cap[a][b]=f;
if(cap[b][a]==0)
G[b].push_back(a);
cost[a][b]=c;
cost[b][a]=-c;
}
cout<<Flux();
return 0;
}