Pagini recente » Cod sursa (job #3143821) | Cod sursa (job #3183327) | Cod sursa (job #1161983) | Cod sursa (job #448633) | Cod sursa (job #302963)
Cod sursa(job #302963)
#include<fstream.h>
#define min(x,y) ((x)<(y)?(x):(y))
#include<string.h>
#define nx 355
#define mx 1000005
#define inf 2000000000
struct graf
{
int nod;
graf *next;
};
graf *a[nx];
int Q[mx],cost[nx][nx],flux[nx][nx],d[nx],n,m,inQ[nx],drum,cap[nx][nx];
int tat[nx],S,D;
long bf()
{
int e,v,r,nr,i;
for (i=1;i<=n;++i)
{
d[i]=inf;inQ[i]=0;tat[i]=-1;
}
d[S]=0;
e=v=1;
nr=1;
Q[1]=S;
while (e<=v)
{
r=Q[e++];
// e=(e+1)%n;
inQ[r]=0;
// nr--;
for (graf *q=a[r];q;q=q->next)
if (cap[r][q->nod]>flux[r][q->nod] && d[q->nod]>d[r]+cost[r][q->nod])
{
d[q->nod]=d[r]+cost[r][q->nod];
tat[q->nod]=r;
if (!inQ[q->nod])
{
//v=(v+1)%n;
Q[++v]=q->nod;
inQ[q->nod]=1;
// ++nr;
}
}
}
if (d[D]!=inf) {
drum=1;
r=inf;
for (i=D;i!=S;i=tat[i])
r=min(r,cap[tat[i]][i]-flux[tat[i]][i]);
for (i=D;i!=S;i=tat[i])
{
flux[tat[i]][i]+=r;
flux[i][tat[i]]-=r;
}
return d[D]*r;
}
return 0;
}
long Flux()
{
long rez=0;
drum=1;
while (drum)
{
drum=0;
rez+=bf();
}
return rez;
}
int main()
{
ifstream be ("fmcm.in");
ofstream ki ("fmcm.out");
be>>n>>m>>S>>D;
int i,x,y,c,p;
for (i=1;i<=m;++i)
{
be>>x>>y>>p>>c;
graf *q=new graf;
q->nod=y;
q->next=a[x];
a[x]=q;
q=new graf;
q->nod=x;
q->next=a[y];
a[y]=q;
cost[x][y]=c;
cost[y][x]=-c;
cap[x][y]=p;
}
be.close();
ki<<Flux()<<'\n';
ki.close();
return 0;
}