Pagini recente » Cod sursa (job #835404) | Cod sursa (job #2066320) | Cod sursa (job #2407672) | Cod sursa (job #2370599) | Cod sursa (job #908601)
Cod sursa(job #908601)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 351;
const int INF = 0x3f3f3f3f;
int N, M, S, D;
vector<int> G[MAXN];
int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
int flow[MAXN][MAXN];
int d[MAXN];
int prev[MAXN];
bool found;
int bellman_ford()
{
vector<bool> inqueue(N + 1, false);
queue<int> q;
q.push(S);
inqueue[S] = true;
for (int i = 1; i <= N; ++i) {
prev[i] = -1;
d[i] = INF;
}
d[S] = 0;
while (!q.empty()) {
int node = q.front();
q.pop();
inqueue[node] = false;
vector<int>::iterator it;
for (it = G[node].begin(); it != G[node].end(); ++it) {
if (cap[node][*it] - flow[node][*it] <= 0)
continue;
if (cost[node][*it] + d[node] < d[*it]) {
prev[*it] = node;
d[*it] = cost[node][*it] + d[node];
if (!inqueue[*it]) {
q.push(*it);
inqueue[*it] = true;
}
}
}
}
if (d[D] < INF / 2) {
found = true;
int fmin = INF;
for (int node = D; node != S; node = prev[node])
fmin = min(fmin, cap[prev[node]][node] - flow[prev[node]][node]);
for (int node = D; node != S; node = prev[node]) {
flow[prev[node]][node] += fmin;
flow[node][prev[node]] -= fmin;
}
return d[D] * fmin;
}
return 0;
}
long long mfmc()
{
long long result = 0;
found = true;
while (found) {
found = false;
result += bellman_ford();
}
return result;
}
int main()
{
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d %d %d %d", &N, &M, &S, &D);
for (int i = 0; i < M; ++i) {
int x, y, c, z;
scanf("%d %d %d %d", &x, &y, &c, &z);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
printf("%lld\n", mfmc());
return 0;
}