Pagini recente » Cod sursa (job #414986) | Cod sursa (job #2737135) | Cod sursa (job #2409423) | Cod sursa (job #512750) | Cod sursa (job #476127)
Cod sursa(job #476127)
#include <fstream>
#include <queue>
#define Nmax 355
using namespace std;
int N, M, S, D, A;
int Cap[Nmax][Nmax], Cst[Nmax][Nmax], Flw[Nmax][Nmax], Dst[Nmax], Ftr[Nmax], Mxf[Nmax];
vector<int> Deg[Nmax];
queue<int> Q;
void read()
{
int x, y, c, z;
ifstream fin("fmcm.in");
fin >> N >> M >> S >> D;
while (M--)
{
fin >> x >> y >> c >> z;
Deg[x].push_back(y);
Deg[y].push_back(x);
Cap[x][y] = c;
Cst[x][y] = z;
Cst[y][x] = -z;
}
fin.close();
}
bool flow()
{
int i, u, v;
vector<int>::iterator j;
for (i = 1; i <= N; ++i)
{
Dst[i] = M;
Mxf[i] = 0;
}
Dst[S] = 0;
Mxf[S] = M;
Q.push(S);
while (!Q.empty())
{
u = Q.front();
for (j = Deg[u].begin(); j != Deg[u].end(); ++j)
{
v = *j;
if (Cap[u][v] > Flw[u][v] && Dst[v] > Dst[u] + Cst[u][v])
{
Dst[v] = Dst[u] + Cst[u][v];
Mxf[v] = min(Mxf[u], Cap[u][v] - Flw[u][v]);
Ftr[v] = u;
if (v != D)
{
Q.push(v);
}
}
}
Q.pop();
}
if (Dst[D] == M)
{
return false;
}
i = Mxf[D];
A += Dst[D] * i;
for (v = D, u = Ftr[D]; v != S; v = u, u = Ftr[u])
{
Flw[u][v] += i;
Flw[v][u] -= i;
}
return true;
}
void solve()
{
M = numeric_limits<int>::max();
while (flow());
}
void write()
{
ofstream fout("fmcm.out");
fout << A << '\n';
fout.close();
}
int main()
{
read();
solve();
write();
return 0;
}