Pagini recente » Cod sursa (job #2739781) | Cod sursa (job #154601) | Cod sursa (job #66635) | Cod sursa (job #3209434) | Cod sursa (job #2447492)
#include <bits/stdc++.h>
#define pii pair<int, int>
#define inf 2147483647
///N=350 nr de noduri
///M=12500 nr de arce
///1<=c<=10000 flux pe muchie
///-10000<=z<=10000 cost pe muchie
using namespace std;
int n, m, s, d, i, j, k, out;
int last[351], maxflow[351][351], cost[351][351], flow[351][351];
int dmin[351], past[351], now[351];
vector<int> graph[351];
priority_queue<pii, vector<pii>, greater<pii> > pq;
///
void read();
void solve();
void write();
bool dij();
int main()
{
read();
solve();
write();
return 0;
}
void read(){
freopen("fmcm.in", "r", stdin);
scanf("%d%d%d%d", &n, &m, &s, &d);
for(i=1; i<=m; ++i){
int x, y, z, c;
scanf("%d%d%d%d", &x, &y, &z, &c);
maxflow[x][y]=z;
cost[x][y]=c;
cost[y][x]=-c;
graph[x].push_back(y);
graph[y].push_back(x);
}
return;
}
void solve(){
while(dij()){
int node, fm=inf;
for(node=d; node!=s; node=last[node]) fm=min(fm, maxflow[last[node]][node]-flow[last[node]][node]);
for(node=d; node!=s; node=last[node]){
flow[last[node]][node]+=fm;
flow[node][last[node]]-=fm;
}
out=out+fm*now[d];
}
return;
}
void write(){
freopen("fmcm.out", "w", stdout);
printf("%d", out);
return;
}
bool dij(){
for(i=1; i<=n; ++i) last[i]=0, dmin[i]=inf;
now[s]=dmin[s]=0;
pq.push({0, s});
while(!pq.empty()){
pii node=pq.top(); pq.pop();
if(node.first>dmin[node.second]) continue;
for(auto next:graph[node.second]){
if(flow[node.second][next]==maxflow[node.second][next]) continue;
int nowcost=cost[node.second][next]+dmin[node.second]+past[node.second]-past[next];
if(nowcost<dmin[next]){
dmin[next]=nowcost;
now[next]=cost[node.second][next]+now[node.second];
pq.push({dmin[next], next});
last[next]=node.second;
}
}
}
for(i=1; i<=n; ++i) past[i]=now[i];
return dmin[d]!=inf;
}