Pagini recente » Cod sursa (job #320311) | Cod sursa (job #3246065) | Cod sursa (job #866243) | Cod sursa (job #9710) | Cod sursa (job #555534)
Cod sursa(job #555534)
#include<fstream.h>
#include<vector.h>
using namespace std;
struct fl { int cost,flux,cap,ind;};
vector <fl> v[400];
int n,S,D,sol,Flux[400][400],Cap[400][400],Cost[400][400],sw[400],C[200000],dist[400],tata[400];
int getflux ()
{
vector <fl> :: iterator it,it2;
int inf,q,i,k,p,u,min1;
inf=2000000000;
memset(sw,0,sizeof(sw));
C[1]=S;p=u=1;sw[S]=1;
for (i=1;i<=n;i++)
dist[i]=inf;
dist[S]=0;
while (p<=u)
{
it2=v[C[p]].end();
for (it=v[C[p]].begin();it<it2;++it)
if (dist[it->ind]>dist[C[p]]+it->cost && Flux[C[p]][it->ind]<Cap[C[p]][it->ind])
{
if (sw[it->ind]==0)
{
sw[it->ind]=1;
C[++u]=it->ind;
}
dist[it->ind]=dist[C[p]]+it->cost;
tata[it->ind]=C[p];
}
++p;sw[C[p-1]]=0;
}
min1=inf;
for (k=D;k!=S;k=tata[k])
if (min1>Cap[tata[k]][k]-Flux[tata[k]][k])
min1=Cap[tata[k]][k]-Flux[tata[k]][k];
for (k=D;k!=S;k=tata[k])
{
Flux[tata[k]][k]+=min1;
Flux[k][tata[k]]-=min1;
}
sol+=min1*dist[D];
return min1!=0;
}
void calculate ()
{
int x;
do
{
x=getflux();
}
while (x!=0);
}
void citire ()
{
int i,x,y,z,c,m;
fl nod;
ifstream f("fmcm.in");
f>>n>>m>>S>>D;
for (i=1;i<=m;i++)
{
f>>x>>y>>c>>z;
Cap[x][y]=c;
Cost[x][y]=z; Cost[y][x]=-z;
nod.ind=y;nod.cap=c;nod.cost=z; nod.flux=0;
v[x].push_back(nod);
nod.ind=x;nod.cap=0;nod.cost=-z;
v[y].push_back(nod);
}
f.close();
}
void afisare ()
{
ofstream g("fmcm.out");
g<<sol<<'\n';
g.close();
}
int main()
{
citire();
calculate();
afisare();
return 0;
}