(模板) MCMF SPFA

struct MCMF {
	int fst[N], nxt[M], vv[M], from[M], cost[M], cap[M], flow[M], e;

	int d[N], a[N], p[N], in[N];

	void init() {
		memset(fst, -1, sizeof fst);
		e = 0;
	}
	void add(int u, int v, int c, int d) {
		from[e] = u, vv[e] = v, nxt[e] = fst[u], cost[e] = d, cap[e] = c, flow[e] = 0, fst[u] = e++;
		from[e] = v, vv[e] = u, nxt[e] = fst[v], cost[e] = -d, cap[e] = 0, flow[e] = 0, fst[v] = e++;
	}

	int spfa(int s, int t, int &mf, int &mc) {
		memset(d, 0x3f, sizeof d);
		d[s] = p[s] = 0;
		a[s] = inf;
		queue<int> q; q.push(s);
		while(!q.empty()) {
			int u = q.front(); q.pop();
			in[u] = 0;
			for(int i = fst[u]; ~i; i = nxt[i]) {
				int v = vv[i], c = cost[i];
				if(cap[i] > flow[i] && d[v] > d[u] + c) {
					d[v] = d[u] + c;
					a[v] = min(a[u], cap[i] - flow[i]);
					p[v] = i;
					if(!in[v]) in[v] = 1, q.push(v);
				}
			}
		}
		if(d[t] == inf) return 0;
		mf += a[t], mc += a[t] * d[t];
		int u = t;
		while(u != s) {
			flow[p[u]] += a[t];
			flow[p[u]^1] -= a[t];
			u = from[p[u]];
		}
		return 1;
	}
	int gao(int s, int t) {
		int ret = 0, mf = 0, mc = 0;
		while(spfa(s, t, mf, mc)) ret = min(ret, mc);
		return mc;
	}

}go;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值