bool spfa(int s,int t)
{
int i,tt;
int inq[3000];
memset(inq,0,sizeof(inq));
memset(p,-1,sizeof(p));
memset(pre,-1,sizeof(pre));
for(i=0;i<=t;i++) d[i]=inf;
d[s]=0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u]=0;
for(tt=H[u];~tt;tt=a[tt].next)
{
if(a[tt].c)
{
int v=a[tt].v;
if(d[v]>d[u]+a[tt].w)
{
d[v]=d[u]+a[tt].w;
p[v]=u;
pre[v]=tt;
if(!inq[v])
{
inq[v]=1;
q.push(v);
}
}
}
}
}
if(d[t]>=inf)
return false;
else
return true;
}
void MCMF(int s,int t)
{
ans_cost=0,ans_flow=0;
while(spfa(s,t))
{
int u=t;
int delta=inf;
while(p[u]!=-1)
{
delta=min(delta,a[pre[u]].c);
u=p[u];
}
u=t;
while(p[u]!=-1)
{
a[pre[u]].c-=delta;
a[pre[u]^1].c+=delta;
u=p[u];
}
ans_cost+=delta*d[t];
ans_flow+=delta;
}
}
提供一个费用流的模板
最新推荐文章于 2019-11-05 21:52:29 发布