KM算法求的是完备匹配下的最大权匹配: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接XiYj有权wij,求一种匹配使得所有wij的和最大。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2255
题意:分房子,对于n个人对n所房子有自己的最大承受价格,要求每个人分到一所房子,并且要求收入最大
输入说明:输入n,代表n个人和n所房子,接下来n行n列代表第i个人对第j所房子的价格
题解:KM算法模板
代码:
#include <stdio.h>
#include <string.h>
#define M 310
#define inf 0x3f3f3f3f
int n,nx,ny;
int match[M],lx[M],ly[M],slack[M];
int visx[M],visy[M],mp[M][M];
int DFS(int root)
{
visx[root] = 1;
for (int son = 1;son <= ny;son ++)
{
if (visy[son])
continue;
int gap = lx[root] + ly[son] - mp[root][son];
if (gap == 0)
{
visy[son] = 1;
if (match[son] == -1||DFS(match[son]))
{
match[son] = root;
return true;
}
}
else if (slack[son] > gap)
slack[son] = gap;
}
return 0;
}
int KM()
{
int i,j;
memset (match,-1,sizeof(match));
memset (ly,0,sizeof(ly));
for (i = 1;i <= nx;i ++) //lx初始化为与它关联边中最大的
for (j = 1,lx[i] = -inf;j <= ny;j ++)
if (mp[i][j] > lx[i])
lx[i] = mp[i][j];
for (int x = 1;x <= nx;x ++)
{
f