Pagini recente » Cod sursa (job #191688) | Cod sursa (job #2575540) | Cod sursa (job #1361428) | Cod sursa (job #932872) | Cod sursa (job #418161)
Cod sursa(job #418161)
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 360
#define oo 2000000000
int n,S,D;
vector <int> A[NMAX];
int nv[NMAX],Dist[NMAX], viz[NMAX],Q[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX], Cost[NMAX][NMAX];
bool inq[NMAX],Drum;
void citire()
{
ifstream fin("fmcm.in");
int m;
fin>>n>>m>>S>>D;
for (int i=0;i<m;++i)
{ int x,y,cap,z;
fin>>x>>y>>cap>>z;
A[x].push_back(y);
A[y].push_back(x);
C[x][y]=cap;
Cost[x][y]=z; Cost[y][x]=-z;
}
for (int i=1;i<=n;++i) nv[i]=A[i].size();
fin.close();
}
int BellmanFord()
{ int i,lq,j;
for (i=1;i<=n;++i)
{Dist[i]=oo; viz[i]=-1;}
Dist[S]=0;
memset(inq,0,sizeof(inq));
lq=1; Q[1]=S; inq[S]=true;
for (i=1;i<=lq;++i)
{
int x=Q[i];
for (j=0;j<nv[x];++j)
if (C[x][A[x][j]]>F[x][A[x][j]] && Dist[A[x][j]]>Dist[x]+Cost[x][A[x][j]])
{
Dist[A[x][j]]=Dist[x]+Cost[x][A[x][j]];
viz[A[x][j]]=x;
if (!inq[A[x][j]])
{
Q[++lq]=A[x][j];
inq[A[x][j]]=true;
}
}
inq[x]=0;
}
if (Dist[D]!=oo)
{
Drum=true;
int fluxmin=oo;
for (i=D; i!=S;i=viz[i])
fluxmin=min(fluxmin,C[viz[i]][i]-F[viz[i]][i]);
for (i=D; i!=S; i=viz[i])
{
F[viz[i]][i]+=fluxmin;
F[i][viz[i]]-=fluxmin;
}
return fluxmin*Dist[D];
}
else return 0;
}
long long flux()
{
long long fmcm=0;
do
{
Drum=0;
fmcm+=BellmanFord();
}
while (Drum);
return fmcm;
}
void afisare(long long f)
{
ofstream fout("fmcm.out");
fout<<f;
fout.close();
}
int main()
{
citire();
afisare(flux());
return 0;
}