Kuhn-Munkres算法

KM算法,求完备匹配下的最大权匹配,时间复杂度O(\(n^3\))

所谓的完备匹配就是在二部图中,x点集中的所有点都有对应的匹配 且 y点集中所有的点都有对应的匹配 ,则称该匹配为完备匹配

算法思想

(1)初始化可行顶标的值;

(2)用匈牙利算法寻找完备匹配;

(3)若未找到完备匹配则修改可行顶标的值;

(4)重复(2)(3)直到找到相等子图的完备匹配为止。

模板

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 310;
const int M = 1e9+7;
int n,m,k,t; int a[maxn][maxn]; //图
int ex_x[maxn]; //x期望能匹配到的y值
int ex_y[maxn]; //y期望能匹配到的x值
bool vis_x[maxn]; //标记是否访问
bool vis_y[maxn]; //标记是否访问
int match[maxn]; //y的匹配
int slack[maxn]; //y的松弛,记录y最少还差多少期望值 bool dfs(int x)
{
vis_x[x] = 1;
for(int y = 0; y <= y; y++)
{
if(vis_y[y]) continue; int gap = ex_x[x]-ex_y[y]-a[x][y]; if(gap == 0) //如果符合要求
{
vis_y[y] = 1;
if(match[y] == -1 || dfs(match[y])) //如果y没有被匹配,或者y的x可以换另一个y
{
match[y] = x;
return true;
}
}
else //不符合要求,我还差gap的期望值才能有匹配
{
slack[y] = min(slack[y],gap);
}
}
} int km()
{
mem(match,-1);mem(ex_y,0); //y期望的x是0
mem(ex_x,0); //初始化
for(int i = 0; i < n; i++) //x期望的y是最大的那个
{
for(int j = 0; j < n; j++)
{
ex_x[i] = max(ex_x[i],a[i][j]);
}
} for(int i = 0; i < n; i++)
{
mem(slack,inf);
while (1)
{
mem(vis_x,0);mem(vis_y,0);
if(dfs(i)) break; //找到匹配 //如果找不到
int d = inf;
for(int j = 0; j < n; j++)
{
if(!vis_y[j]) d = min(d,slack[j]);
} for(int j = 0; j < n; j++) //降低期望
{
if(vis_x[j]) ex_x[j] -= d; if(vis_y[j]) ex_y[j] += d;
else slack[j] -= d;
}
}
} int res = 0;
for(int i = 0; i < n; i++)
{
res += a[match[i]][i];
}
return res;
} int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
#endif
while (~cin(n))
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin(a[i][j]);
}
}
printf("%d\n",km());
}
return 0;
}

例题

http://acm.hdu.edu.cn/showproblem.php?pid=2255

参考博客

https://www.cnblogs.com/wenruo/p/5264235.html

https://baike.baidu.com/item/KM算法

二分图匹配--KM算法的更多相关文章

  1. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  2. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  3. 二分图最大权匹配——KM算法

    前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...

  4. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  6. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

  7. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  8. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  9. 二分图匹配之最佳匹配——KM算法

    今天也大致学了下KM算法,用于求二分图匹配的最佳匹配. 何为最佳?我们能用匈牙利算法对二分图进行最大匹配,但匹配的方式不唯一,如果我们假设每条边有权值,那么一定会存在一个最大权值的匹配情况,但对于KM ...

随机推荐

  1. DELPHI6中DSGNINTF.DCU找不到时的解决方法

    https://www.cnblogs.com/gaodu2003/archive/2009/06/04/1495789.html 1.添加 lib\designide.dcp到控件的dpk文件的re ...

  2. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  3. docker查看日志记录

    命令格式: $ docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since strin ...

  4. GitLab+Jenkins持续集成

    一.概述 GitLab是一个代码仓库,用来管理代码.Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务.所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins ...

  5. 【leetcode-11】盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  6. yii框架定时任务的操作

    在项目根目录里找到console(操作台,控制台)文件夹,在console文件夹里建一个TestController文件,如图所示: 文件内部写如下内容: 切记该文件继承的Controller一定是 ...

  7. ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi

    写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...

  8. [SDOI2008]仪仗队(欧拉函数)

    题目 [SDOI2008]仪仗队 解析 这个题,我也不知道他们的soltion是怎么写的这么长的. 我们发现我们一次看一条直线上的第一个点,也就是说,若两个点斜率\(k=\frac{y}{x}\)相同 ...

  9. Git撤销add、commit

    撤销add git status 查看当下更新的文件 git reset HEAD 表示撤销上次add的所有文件 git reset HEAD dir/dir/test.php 撤销指定文件 撤销co ...

  10. 2019-07-25 PDO

    PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...