KM算法(完备匹配下的最大权匹配)

KM算法主要用于寻找二分图中的最大权完备匹配。本文通过两个实例介绍了算法的应用,分别是根据个人对房子的最大承受价格进行房屋分配以最大化收入的问题,以及在一个n*m的图中让所有人进入房子的最短步数问题。通过KM算法模板解决这两个问题。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值