Pagini recente » Cod sursa (job #2847300) | Cod sursa (job #2336970) | Cod sursa (job #2455335) | Cod sursa (job #2156596) | Cod sursa (job #2130619)
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#define nmax 355
using namespace std;
fstream f1("fmcm.in", ios::in);
fstream f2("fmcm.out", ios::out);
int n, m, S, D, cost[nmax][nmax], cap[nmax][nmax], flux[nmax][nmax], viz[nmax], dist[nmax], coada[12505], prim, ultim, k, l[nmax], fmax;
vector <int> v[nmax];
void citire()
{
int i, x, y, c, ct;
f1>>n>>m>>S>>D;
for(i=1; i<=m; i++)
{
f1>>x>>y>>c>>ct;
cost[x][y]=ct;
cost[y][x]=-ct;
cap[x][y]=c;
cap[y][x]=0;///nu exista arc y->x
v[x].push_back(y);
v[y].push_back(x);
}
}
void init()
{
int i;
memset(viz, 0, sizeof(viz));
memset(l, 0, sizeof(l));
for(i=1; i<=n; i++) dist[i]=1000000000;
viz[S]=1;
dist[S]=0;
prim=ultim=k=1;
coada[prim]=S;
}
int bellmanford()
{
init();
int nod, vec;
while(k!=0)
{
nod=coada[prim]; viz[nod]=0;
prim++; k--;
if(prim> 12500) prim=1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
{
vec=*it;
if((dist[vec]> dist[nod]+cost[nod][vec])&&(cap[nod][vec]-flux[nod][vec]> 0))
{
dist[vec]= dist[nod]+cost[nod][vec];
l[vec]=nod;
if(!viz[vec])
{
viz[vec]=1;
ultim++; k++;
if(ultim> 12500) ultim=1;
coada[ultim]=vec;
}
}
}
}
return l[D];
}
void amelioreaza()
{
int i, mini=10005;
for(i=D; i!=S; i=l[i])
mini=min(mini, cap[l[i]][i]-flux[l[i]][i]);
for(i=D; i!=S; i=l[i])
{
flux[l[i]][i]+=mini;
flux[i][l[i]]-=mini;
}
fmax+=dist[D]*mini;
}
int main()
{
citire();
while(bellmanford())
{
amelioreaza();
}
f2<<fmax;
return 0;
}