Pagini recente » Cod sursa (job #2931260) | Cod sursa (job #407021) | Cod sursa (job #491735) | Cod sursa (job #2367365) | Cod sursa (job #3227102)
#include <bits/stdc++.h>
using namespace std;
///----------TOGGLES
#define FIO
//#define LONGER
//#define TESTS
///---------
#ifdef LONGER
#define int long long
#endif // LONGER
#ifdef FIO
#ifdef LOCAL
const string fname="maxflow";
#else
const string fname="fmcm";
#endif // LOCAL
ifstream in(fname+".in");
ofstream out(fname+".out");
#define cin in
#define cout out
#endif // FIO
///--------
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
///-------STL++-----
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) x.size()
#define pb(x,y) x.push_back(y)
#define mp(x,y) make_pair(x,y)
#define fr(i,n) for(int i=1;i<=n;i++)
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pdd = pair<double, double>;
using veci = vector<int>;
using vecp = vector<pii>;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T> >;
///-----CODE GOES HERE-----
const int maxn = 1005;
const int maxval = 1e9+7;
int n,m;
veci fg[maxn];
int cap[maxn][maxn], cst[maxn][maxn];
int d[maxn],inq[maxn], tata[maxn];
int s,f;
pii fluxBfs()
{
fill(d+1, d+n+1, maxval);
fill(inq+1, inq+n+1, 0);
fill(tata+1, tata+n+1, -1);
d[s]=0;
inq[s]=1;
queue<int> q;
q.push(s);
while(!q.empty())
{
int t=q.front();
//cerr<<"here "<<t<<'\n';
q.pop();
inq[t]=0;
for(auto e:fg[t])
{
if(cap[t][e]<=0) continue;
if(d[e]>cst[t][e]+d[t])
{
d[e]=cst[t][e]+d[t];
tata[e]=t;
if(!inq[e])
{
inq[e]=1;
q.push(e);
}
}
}
}
/*for(int i=1;i<=n;i++)
{
cerr<<d[i]<<' ';
}
cerr<<'\n';*/
if(tata[f]==-1) return mp(0,0);
int ans=0;
int c=0;
int j, add=0;
add=maxval;
j=f;
while(j!=s)
{
add=min(add, cap[tata[j]][j]);
j=tata[j];
}
if(add==0) return mp(0,0);
j=f;
while(j!=s)
{
cap[tata[j]][j]-=add;
cap[j][tata[j]]+=add;
c+=cst[tata[j]][j]*add;
j=tata[j];
}
ans+=add;
return mp(ans,c);
}
pii doFlux()
{
int ans=0, cst=0;
pii x;
while((x=fluxBfs()).first!=0) ans+=x.first, cst+=x.second;
return mp(ans,cst);
}
void solve()
{
{
cin>>n>>m>>s>>f;
int a,b,c, d;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c>>d;
pb(fg[a],b);
pb(fg[b],a);
cap[a][b]=c;
cst[a][b]=d;
cst[b][a]=-d;
}
}
pii x=doFlux();
cout<<x.second<<'\n';
}
///---MAIN FUNC-------
int32_t main()
{
IOS;
int t=1;
#ifdef TESTS
cin>>t;
#endif // TESTS
while(t--)
{
solve();
}
return 0;
}