Pagini recente » Cod sursa (job #525907) | Cod sursa (job #599255) | Cod sursa (job #324657) | Cod sursa (job #2516469) | Cod sursa (job #2750497)
#include<bits/stdc++.h>
using namespace std;
#define INIT ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
//#define int ll
ifstream fin("fmcm.in"); ofstream fout("fmcm.out");
#define cin fin
#define cout fout
int t, n, m, s;
int g[351][351];
int D[351];
int e[12501][4];
void bellman_ford(){
for(int i=1; i<=n; i++){
D[i]=1e9;
}
D[s]=0;
for(int v=1; v<=n; v++){
for(int i=1; i<=m; i++){
D[e[i][1] ]=min(D[e[i][1] ], D[e[i][0] ]+g[e[i][0] ][e[i][1] ]);
//D[e[i][0] ]=min(D[e[i][0] ], D[e[i][1] ]+g[e[i][1] ][e[i][0] ]);
}
}
}
int g2[351][351], r[351][351], c[351][351];
vector<int> g3[351];
void prepare(){
for(int i=1; i<=m; i++){
g2[e[i][0] ][e[i][1] ]=g[e[i][0] ][e[i][1] ]+D[e[i][0] ]-D[e[i][1] ];
g2[e[i][1] ][e[i][0] ]=-g2[e[i][0] ][e[i][1] ];
c[e[i][0] ][e[i][1] ]=e[i][2];
}
}
int d[351], f[351];
bool v[351];
int par[351];
int res=0;
bool dijkstra(){
for(int i=1; i<=n; i++){
d[i]=1e9; f[i]=0;
v[i]=false;
par[i]=0;
}
f[s]=1e9; d[s]=0;
multiset<pair<pii, int> > ms;
ms.insert({{d[s], -f[s] }, s});
while(!ms.empty()){
auto pr=*ms.begin(); ms.erase(ms.begin());
int nod=pr.sc;
v[nod]=true;
for(auto u:g3[nod]){
if(v[u]){continue;}
pii st={d[u], -f[u] };
auto it=ms.find({st, u });
if(it==ms.end()){
if( min(f[nod], c[nod][u]-r[nod][u] )>0 ){
d[u]=d[nod]+g2[nod][u];
f[u]=min(f[nod], c[nod][u]-r[nod][u] );
ms.insert({{d[u], -f[u]}, u});
par[u]=nod;
}
}
else{
if( (min(f[nod], c[nod][u]-r[nod][u] )>0) && ( mp( d[nod]+g2[nod][u], -min(f[nod], c[nod][u]-r[nod][u] ) )<it->ft ) ){
d[u]=d[nod]+g2[nod][u];
f[u]=min(f[nod], c[nod][u]-r[nod][u] );
ms.erase(it);
ms.insert({{d[u], -f[u]}, u});
par[u]=nod;
}
}
}
}
if(f[t]==0){
return false;
}
int ac=t;
while(ac!=s){
r[par[ac] ][ac]+=f[t];
r[ac ][par[ac] ]-=f[t];
ac=par[ac];
}
//cout<<f[t]<<" "<<(d[t]+D[t])<<"\n";
res+=f[t]*(d[t]+D[t]);
for(int i=1; i<=n; i++){
D[i]=D[i]+d[i];
}
prepare();
return true;
}
int32_t main(){
INIT
cin>>n>>m>>s>>t;
for(int i=1; i<=m; i++){
cin>>e[i][0]>>e[i][1]>>e[i][2]>>e[i][3];
g[e[i][0] ][e[i][1] ]=e[i][3];
//g[e[i][1] ][e[i][0] ]=-e[i][3];
g3[e[i][0] ].pb(e[i][1] );
g3[e[i][1] ].pb(e[i][0]);
}
bellman_ford();
//cout<<D[t]<<"\n";
prepare();
while(dijkstra() ){}
cout<<res<<"\n";
return 0;
}