Pagini recente » Cod sursa (job #776110) | Cod sursa (job #2755887) | Cod sursa (job #909219) | Cod sursa (job #1441967) | Cod sursa (job #625266)
Cod sursa(job #625266)
#include <fstream>
#include <vector>
#include <queue>
#define DIM 360
#define DIM_M 12501
#define INF 0x3f3f3f3f
using namespace std;
int n, m, flux, cst, S, D;
vector<int> G[DIM];
int c[DIM][DIM], f[DIM][DIM], cost[DIM][DIM];
int cr[DIM_M];
vector<int> t;
void Read();
void EK();
bool BF();
void Augment();
void Write();
int main()
{
Read();
EK();
Write();
return 0;
}
void Read()
{
ifstream fin("fmcm.in");
fin >> n >> m >> S >> D;
int x, y, cap, cos;
for (int i = 1; i <= m; ++i)
{
fin >> x >> y >> cap >> cos;
G[x].push_back(y);
G[y].push_back(x);
c[x][y] = cap; c[y][x] = 0;
cost[x][y] = cos; cost[y][x] = cos * (-1);
}
fin.close();
}
void EK()
{
while (BF())
Augment();
}
bool BF()
{
queue<int> Q;
t.assign(n+1, 0);
vector<int> d(n+1, INF);
vector<bool> s(n+1);
d[S] = 1;
cr[S] = INF;
Q.push(S);
while (!Q.empty())
{
int i = Q.front();
Q.pop();
for (int k = 0; k < G[i].size(); ++k)
{
int j = G[i][k];
if (f[i][j] < c[i][j] && d[j] > d[i] + cost[i][j])
{
d[j] = d[i] + cost[i][j];
cr[j] = min(cr[i], c[i][j] - f[i][j]);
t[j] = i;
s[j] = 1;
Q.push(j);
}
}
}
if (s[D]) return true;
return false;
}
void Augment()
{
int i, j;
j = D;
while (j != S)
{
i = t[j];
f[i][j] += cr[D];
f[j][i] -= cr[D];
cst += cr[D] * cost[i][j];
j = i;
}
}
void Write()
{
ofstream fout("fmcm.out");
fout << cst << '\n';
fout.close();
}