Pagini recente » Cod sursa (job #455916) | Cod sursa (job #1309679) | Cod sursa (job #873709) | Cod sursa (job #2707667) | Cod sursa (job #2130670)
#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], dreal1[nmax], dreal2[nmax], dfictiv[nmax];
int 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++) dreal1[i]=1000000000;
viz[S]=1;
dreal1[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((dreal1[vec]> dreal1[nod]+cost[nod][vec])&&(cap[nod][vec]-flux[nod][vec]> 0))
{
dreal1[vec]= dreal1[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+=dreal1[D]*mini;
}
int dijkstra()
{
int i, j, mini, vfmin;
memset(viz, 0, sizeof(viz));
memset(l, 0, sizeof(l));
for(i=1; i<=n; i++)
dfictiv[i]=1000000000;
dreal2[S]=0;
dfictiv[S]=0; //nu vizitezi sursa si selectezi n noduri
for(i=1; i<=n; i++)
{
mini=1000000000;
for(j=1; j<=n; j++)
if((!viz[j])&&(dfictiv[j]< mini)) {mini=dfictiv[j]; vfmin=j;}
viz[vfmin]=1;
for(j=1; j<=n; j++)
if((!viz[j])&&(cap[vfmin][j]-flux[vfmin][j]>0)&&(dfictiv[j]> dfictiv[vfmin]+ (cost[vfmin][j]+dreal1[vfmin]-dreal1[j]))) ///pui costul fictiv
{
dfictiv[j]= dfictiv[vfmin]+ (cost[vfmin][j]+dreal1[vfmin]-dreal1[j]);
dreal2[j]=dreal2[vfmin]+cost[vfmin][j];
l[j]=vfmin;
}
}
for(i=1; i<=n; i++) dreal1[i]=dreal2[i];
return (dfictiv[D]!=1000000000);
}
int main()
{
citire();
int ok=bellmanford();
while(ok && dijkstra())
{
amelioreaza();
}
f2<<fmax;
return 0;
}