建模比较简单:
求出平均数tp。
让S连向 a[i]>tp的节点表示这些仓库需要货物送出,让a[i]<tp的节点连向T表示这些仓库需要货物送入。容量为差值,花费为0
然后相邻点连边,容量为inf,花费为1,表示相邻两点可以传送货物。
//这里可以不连满,只从a[i]>tp 的点连向a[i]<tp的点也行!
以下是最小费用最大流的两种写法对比:
当图是稀疏图时,spfa有很高的效率,而稠密图spfa很容易被卡掉。视情况选择就行。
dij版本
#include<bits/stdc++.h>
using namespace std;
const int N = 5001;
const int M = 50001;
struct MCMF
{
int n, s, t, cnt = 1;
long long maxflow=0, mincost=0;
int dis[N], head[N], incf[N], pre[N];//dis表示最短路,incf表示当前增广路上最小流量,pre表示前驱
bool vs[N];
int h[N];//dij中的势能
struct EDGE {
int nxt, to, flow,cost;
}ee[M << 1];
inline void AD(int x, int y, int flow, int cost) {
ee[++cnt].nxt = head[x];
ee[cnt].to = y;
ee[cnt].cost = cost;
ee[cnt].flow = flow;
head[x] = cnt;
}
inline void ad