Pagini recente » Cod sursa (job #147339) | Cod sursa (job #926518) | Cod sursa (job #1545237) | Cod sursa (job #560835) | Cod sursa (job #1409497)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
typedef int var;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
struct Edge {
var node, f, c, k, vec;
var rev;
Edge (var t, var a, var c, var d, var r) {
node = t;
vec = a;
f = 0;
this->c = c;
k = d;
rev = r;
}
Edge () {}
};
vector<Edge> Edges(1);
#define MAXN 1000
#define INF (1 << 30)
vector<pair<var, var> > G[MAXN];
var n;
bool INQ[MAXN];
var DI[MAXN];
var PE[MAXN], PN[MAXN];
var S, D;
queue<var> Q;
bool bellman() {
for(var i=1; i<=n; i++) {
DI[i] = INF;
PN[i] = 0;
PE[i] = 0;
}
DI[S] = 0;
Q.push(S);
while(!Q.empty()) {
var node = Q.front();
Q.pop();
INQ[node] = 0;
for(auto &p : G[node]) {
var vec = p.first;
Edge &e = Edges[p.second];
if(e.c > e.f && DI[vec] > DI[node] + e.k) {
DI[vec] = DI[node] + e.k;
PE[vec] = p.second;
PN[vec] = node;
if(!INQ[vec]) {
Q.push(vec);
INQ[vec] = 1;
}
}
}
}
return PE[D] != 0;
}
var mfmc() {
var total = 0;
while(bellman()) {
var M = INF;
for(var node = D; node != S; node = PN[node]) {
Edge &e = Edges[PE[node]];
M = min(M, e.c - e.f);
}
for(var node = D; node != S; node = PN[node]) {
Edge &e = Edges[PE[node]];
e.f += M;
Edges[e.rev].f -= M;
total += e.k * M;
}
}
return total;
}
void addEdge(var a, var b, var cap, var cost) {
var i = Edges.size();
Edges.push_back(Edge(a, b, cap, cost, i+1));
Edges.push_back(Edge(b, a, 0, -cost, i));
G[a].push_back(make_pair(b, i));
G[b].push_back(make_pair(a, i+1));
}
int main() {
var m, a, b, c, k;
fin>>n>>m>>S>>D;
while(m--) {
fin>>a>>b>>c>>k;
addEdge(a, b, c, k);
}
fout<<mfmc();
}