网络流二十四题 ————(十二)、P4014 分配问题 二分图带权匹配 网络流解法

通过实践网络流解决了分配问题,建立了工人与工作的费用流模型,阐述了如何构建二分图并设置流量和费用,从而求解最小费用最大流或最大带权匹配。文中提及使用Dijkstra算法和SPFA写法。
摘要由CSDN通过智能技术生成

做了10多道网络流,没看题解和思路,自己就建立出了二分图带权匹配的费用流模型。

感觉已经算是入门了!!

如下建边:

左部图n个点表示工人,右部图n个点表示工作

S连向左部图每个点,流量为1,费用为0.

右部图每个点连向T,流量为1,费用为0。这里连向S,T的边流量为1的目的是为了让每个工人做一个工作,每个工作只能一个工人做!

然后工人i连向工作j,流量为1,费用为a[i][j],这样跑最小费用最大流,求出的是最小的工作效率,即二分图最小带权匹配。

显然费用直接设为负数,就是二分图的最大带权匹配了!!!

dijkstra 解法:

这里刚开始的图就不满足 d[u]+h[u]-[v]>0 所以我们刚开始要就要先赋予一定势能。

#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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值