Pagini recente » Cod sursa (job #1734945) | Cod sursa (job #2227290) | Cod sursa (job #2594591) | Cod sursa (job #3268963) | Cod sursa (job #2044138)
#include <fstream>
#include <queue>
#include <vector>
#define file "fmcm"
#define N 355
#define oo 1e7
using namespace std;
ifstream fin(file".in");
ofstream fout(file".out");
int n,m,s,d,x,y,c,z;
int cc[N][N],zz[N][N],f[N][N];// cc - capacitate, zz - cost, f - flux
int ant[N],dist[N];
queue<int> q;
vector<int> g[N]; //muchii
bool E[N];
void citire()
{
fin>>n>>m>>s>>d;
while(m--)
{
fin>>x>>y>>c>>z;
g[x].push_back(y);
g[y].push_back(x);
cc[x][y] = c;
//cc[y][x] = 0
zz[x][y] = z;
zz[y][x] = -z;
}
}
inline int BellmanFord()
{
int p,nod;
for(int i=1; i<=n; ++i)
dist[i] = oo;
dist[s] = 0;
//dist[i] distanta de la sursa s la i
E[s] = 1;
// E[i] = 1, daca nodul i este in coada nu trebuie adaugat din nou, modificarile vor fi aceleasi
q.push(s);
while(!q.empty())
{
nod = q.front();
q.pop();
for(int i=0; i<g[nod].size(); ++i)
{
p = g[nod][i]; //nodul urmator
if(dist[p] > dist[nod] + zz[nod][p] && cc[nod][p] - f[nod][p] > 0)
{
dist[p] = dist[nod] + zz[nod][p];
ant[p] = nod;
if(!E[p])
{
q.push(p);
E[p] = 1;
}
}
}
E[nod] = 0;
}
if(dist[d] == oo) return 0;
int fluxmin = oo;
for(int nod = d; nod != s; nod = ant[nod])
fluxmin = min(fluxmin,cc[ant[nod]][nod] - f[ant[nod]][nod]);
for(int nod = d; nod != s; nod = ant[nod])
{
f[ant[nod]][nod] += fluxmin;
f[nod][ant[nod]] -= fluxmin;
}
return fluxmin * dist[d];
}
int main()
{
citire();
int flux = 0,sol = 0;
do
{
flux += sol;
sol = BellmanFord();
}while(sol != 0);
fout<<flux<<"\n";
return 0;
}