Pagini recente » Cod sursa (job #234615) | Cod sursa (job #331530) | Monitorul de evaluare | Cod sursa (job #2881506) | Cod sursa (job #1201762)
#include<cstdio>
#include<queue>
#include<vector>
FILE* in=fopen("fmcm.in","r");
FILE* out=fopen("fmcm.out","w");
const int Q=351;
int nrnod,nrmuc,s,d;
struct matrice
{
int cap,cost,p,flux;
} v[Q][Q];
struct muchie{
int a,b;
} m[12501];
struct comp{
bool operator()(const int& x,const int& y) const
{
return v[m[x].a][m[x].b].cost>v[m[y].a][m[y].b].cost;
}
};
std::priority_queue<int,std::vector<int>,comp> h;
bool viz[Q];
int pred[Q];
bool disjk()
{
memset(viz,0,sizeof viz);
int act=s;
while(!h.empty())
h.pop();
viz[s]=1;
for(int i=1; i<=nrnod; i++)
{
if(v[s][i].cap-v[s][i].flux>0)
{
h.push(v[s][i].p);
}
}
int par;
while(!h.empty())
{
par=h.top();
h.pop();
if(viz[m[par].b]==1)
continue;
act=m[par].b;
viz[act]=1;
pred[act]=m[par].a;
if(act==d)
{
return 1;
}
for(int i=1; i<=nrnod; i++)
{
if(viz[i]==0 && v[act][i].cap-v[act][i].flux>0)
h.push(v[act][i].p);
}
}
return 0;
}
int parcurge()
{
int act=d;
int rez=2000000000;
while(pred[act]!=0)
{
if(v[pred[act]][act].cap-v[pred[act]][act].flux<rez)
rez=v[pred[act]][act].cap-v[pred[act]][act].flux;
act=pred[act];
}
return rez;
}
int cc;
void fluxeaza(int x)
{
int act=d;
while(pred[act]!=0)
{
if(v[pred[act]][act].flux>=0)
cc+=v[pred[act]][act].cost*x;
else
cc-=v[pred[act]][act].flux*x;
v[pred[act]][act].flux+=x;
v[act][pred[act]].flux-=x;
act=pred[act];
}
}
int main()
{
fscanf(in,"%d%d%d%d",&nrnod,&nrmuc,&s,&d);
int a,b,cap,cost;
for(int i=1; i<=nrmuc; i++)
{
fscanf(in,"%d%d%d%d",&a,&b,&cap,&cost);
v[a][b].cap=cap;
v[a][b].cost=cost;
v[a][b].p=i;
m[i].a=a;
m[i].b=b;
}
int min;
while(disjk())
{
min=parcurge();
fluxeaza(min);
}
fprintf(out,"%d",cc);
}