最小费用最大流的思路非常简单
用flow储存流量,cost储存费用
每一次跑一次最短路,最短路用来寻找最小费用,然后P数组用来记录路径
寻找完最短路后需要在路径中找最小流量,然后修改flow的值
//需提前定义flow,cost,p,dis数组
void spfa(int s,int t)
{
queue <int>q;
int i,v;
bool vis[MAXV];
memset(p,-1,sizeof(p));
memset(vis,false,sizeof(vis));
for(i=s; i<=t; i++) dis[i]=INF;
dis[s]=0;
q.push(s);
vis[s]=true;
while(!q.empty())
{
v=q.front();
q.pop();
vis[v]=false;
for(i=0; i<=sink; i++)
{
if(flow[v][i] && dis[v]+cost[v][i]<dis[i])
{
dis[i]=dis[v]+cost[v][i];
p[i]=v;
if(!vis[i])
{
vis[i]=true;
q.push(i);
}
}
}
}
}
void MCMF(int s,int t)
{
int v,minflow;
maxflow=0;
while(1)
{
spfa(0,t);
if(p[t]==-1) break;
minflow=INF;
v=t;
while(p[v]!=-1)
{
minflow=min(minflow,flow[p[v]][v]);
v=p[v];
}
v=t;
while(p[v]!=-1)
{
flow[p[v]][v]-=minflow;
flow[v][p[v]]+=minflow;
v=p[v];
}
maxflow+=minflow;
mincost+=dis[sink]*minflow;
}
}