做了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)