Pagini recente » Cod sursa (job #3174646) | Cod sursa (job #890977) | Cod sursa (job #765942) | Cod sursa (job #2569536) | Cod sursa (job #1739449)
#include <bits/stdc++.h>
#define maxN 352
#define ll long long
#define inf 2000000000
using namespace std;
int n, m, s, d, D[maxN], prv[maxN], cost[maxN][maxN], c[maxN][maxN], f[maxN][maxN];
vector < int > V[maxN];
queue < int > q;
bool inq[maxN];
bool way;
ll ans;
void read()
{
int i;
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, &C, &z);
V[x].push_back(y);
V[y].push_back(x);
cost[x][y] = z;
cost[y][x] = -z;
c[x][y] = C;
}
}
void BellmanFord()
{
int i, j;
for (i = 1; i <= n; ++ i)
{
D[i] = inf;
prv[i] = -1;
}
memset(inq, 0, sizeof(inq));
D[s] = 0;
inq[s] = 1;
q.push(s);
while (!q.empty())
{
int nod, x = q.front();
inq[x] = 0;
q.pop();
for (i = 0; i < V[x].size(); ++ i)
if (c[x][nod = V[x][i]] - f[x][V[x][i]] > 0 && D[nod] > D[x] + cost[x][nod])
{
D[nod] = D[x] + cost[x][nod];
prv[nod] = x;
if (!inq[nod])
{
inq[nod] = 1;
q.push(nod);
}
}
}
if (D[d] != inf)
{
way = 1;
int cf = inf;
for (i = d; i != s; i = prv[i])
if (c[prv[i]][i] - f[prv[i]][i] < cf)
cf = c[prv[i]][i] - f[prv[i]][i];
for (i = d; i != s; i = prv[i])
{
f[prv[i]][i] += cf;
f[i][prv[i]] -= cf;
}
ans += 1LL * cf * D[d];
}
}
void solve()
{
ans = 0;
way = 1;
while (way)
{
way = 0;
BellmanFord();
}
}
void write()
{
freopen("fmcm.out", "w", stdout);
printf("%lld\n", ans);
}
int main()
{
read();
solve();
write();
return 0;
}