Pagini recente » Cod sursa (job #793338) | Cod sursa (job #8090) | Cod sursa (job #1472232) | Cod sursa (job #2182181) | Cod sursa (job #2048009)
#include <bits/stdc++.h>
#define oo 100000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<int> v[400];
queue<int> coada;
int C[400][400], F[400][400], cost[400][400];
int dist[400], TT[400], in_coada[400];
int drum, S, D, n, m;
int bellman_ford()
{
int top, vec;
for(int i=1; i<=n; i++)
{
dist[i] = oo;
TT[i] = -1;
}
coada.push(S);
coada.push(S);
in_coada[S] = 1;
dist[S] = 0;
while(!coada.empty())
{
top = coada.front();
for(int i=0; i<v[top].size(); i++)
{
vec = v[top][i];
if(C[top][vec]-F[top][vec] > 0 && dist[vec] > dist[top] + cost[top][vec])
{
dist[vec] = dist[top] + cost[top][vec];
TT[vec] = top;
if(!in_coada[vec])
{
coada.push(vec);
in_coada[vec] = 1;
}
}
}
coada.pop();
in_coada[top] = 0;
}
if(dist[D] != oo)
{
int vmin = oo;
drum = 1;
for(int nod = D; nod!=S; nod = TT[nod])
vmin = min(vmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
for(int nod = D; nod!=S; nod = TT[nod])
{
F[TT[nod]][nod] += vmin;
F[nod][TT[nod]] -= vmin;
}
return vmin*dist[D];
}
return 0;
}
int flux()
{
int rezultat = 0;
drum = 1;
while(drum)
{
drum = 0;
rezultat += bellman_ford();
}
return rezultat;
}
int main()
{
int x, y, c, z;
fin >> n >> m >> S >> D;
for(int i=1; i<=m;i++)
{
fin >> x >> y >> c >> z;
v[x].push_back(y);
v[y].push_back(x);
C[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
fout<<flux();
return 0;
}