二分图匹配(KM算法)n^3

KM算法(DFS版,优化DFS版,BFS版) KM算法主要用于二分图的最大权匹配问题 图解 模板 如果我们要求边权值最小的匹配可以把边权值取负值,得出结果后再取相反数即为答案。 KM算法各版本模板: dfs版KM算法模板O(n4)复杂度 图解+模板 题集 对访问过且匹配过的男生,期望值要加上女生减去的期望值;代码中的未访问过的男生实际上包含两种,一种是完全没被访问过的(slack[ j ] = INF),一种是访问过,且更新过slack值但没有参与匹配的男生,由于这种男生可匹配的部分女生期望值降低,所以该男生的slack值减少。 HDU 2255 模板 阅读详情
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
const int maxn = 301;
const int INF = (1<<31)-1;
int w[maxn][maxn];
int lx[maxn],ly[maxn]; //顶标

int linky[maxn];

int visx[maxn],visy[maxn];
int slack[maxn];
int n;
bool find(int x)
{
    visx[x] = true;
    for(int y = 1; y <=n; y++)
    {
        if(visy[y])   continue;
        int t = lx[x] + ly[y] - w[x][y];
        if(t==0)
        {
            visy[y] = true;
            if(linky[y] == -1 || find(linky[y]))
            {
                linky[y] = x;
                return true;        
            }
        }
        else if(slack[y] > t)      slack[y] = t;
    }
    return false;                   
}

int KM()                
{
    int i,j;

    memset(linky,-1,sizeof(linky));
    memset(ly,0,sizeof(ly));
    
    for(i = 1; i <=n; i++)			//初始化顶标 
    {
         lx[i] = -INF;
         for(j = 1; j <=n; j++)
         {
            if(w[i][j] > lx[i])   lx[i] = w[i][j];         	
         }
    }

    for(int x = 1; x <=n; x++)
    {
        for(i = 1; i <=n; i++) 	slack[i] = INF;
        while(true)
        {
            memset(visx,0,sizeof(visx));
            memset(visy,0,sizeof(visy));
            if(find(x))  break;
            int d = INF;
            
            for(i = 1; i <=n; i++)          
            {
                if(!visy[i] && d > slack[i])    d = slack[i];
            }
            for(i = 1; i <=n; i++)
            {
                if(visx[i])    lx[i] -= d;
            }
            for(i = 1; i <=n; i++)
            {
                if(visy[i])	   ly[i] += d;
                else           slack[i] -= d;
            }
        }
    }
    
    int result = 0;
    for(i = 1; i <=n; i++)
    {
	    if(linky[i]>-1)
	    {
	        result += w[linky[i]][i];    	    	
	    }
    }

    return result;
}

int main()
{

    while(scanf("%d",&n)==1)
    {
        int cost;
        for(int i=1;i<=n;i++)
        {
	        for(int j=1;j<=n;j++)
	        {
	            scanf("%d",&cost);
	            w[i][j] = cost;
	        }        	
        }
        printf("%d\n",KM());
    }
    return 0;
}
更新顶标的问题的了
模板 - KM算法(O(n^3))(二分图最大权完美匹配) 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配。 求一种完美匹配的方案,使得最终匹配边的边权之和最大。 //Data const int N=500; int n,m,e[N+7][N+7]; //KM int mb[N+7],vb[N+7],ka[N+7],kb[N+7],p[N+7],c[N+7]; int qf,qb,q[N+7]; void Bfs(int u){ int a,v=0,vl=0,d; for(int i=1;i<=n;i 阅读详情

相关推荐

2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

整理的算法模板合集: ACM模板 前面好几段又在讲故事… 题目大意:   a[i]表示对手的每个队伍战斗力   p[i]表示打败对手后获得的分数   b[i]表示我方第一种人的战斗力   c[i]表示我方第二种人的战斗力   定义我方一组选手的战斗力为b[i]+c[j],第一种选手与第二种选手某种顺序两两组队后,与对方进行pk,共有 n!n!n! 种pk顺序,求最大期望×n 期望就是加权平均,期望*n实际上就是所有方案中的最大权值,也就是二分图最大加权匹配 所以这是一个板子题,但是数据卡O(n4)O(n

繁凡さん的博客 912

KM算法学习笔记

二分图定义 图的顶点恰好可以分成两个集合,同一个集合内的顶点间不允许有边,处在不同集合的顶点允许有边相连。 问题分类 最大匹配问题:匈牙利算法、Hopcroft–Karp算法 最优权值匹配问题:Kuhn-Munkras算法 关键思想 增广路(augmenting path):假设目前已有一个匹配结果,存在一组未匹配定点的OD,能够找到...

weixin_34290000的博客 964

二分图最大匹配及最大权匹配(km算法)

看过很多二分图匹配的ppt,感觉就这个说的最清楚了,是一个叫刘汝佳的人写的,百度搜了一下貌似挺牛逼的,不管那么多,对km算法还抓耳挠腮的同志可以看看这个。

使用Python实现二分图的KM算法在出租车订单匹配上的应用

1. 需求 实现一个出租车仿真系统

烤奶一杯加热不加糖 2753

KM_KM算法_C++_ACM_

本代码为基于BFS的KM算法,复杂度为O(n^3)

Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整项目源码)

本文详细介绍了如何使用Unity 2022.3.3 LTS和Visual Studio 2022从零构建《吸血鬼幸存者》式战斗系统。通过图文开发教程,涵盖对象池优化、ECS架构雏形、2D物理碰撞控制等关键技术,帮助开发者高效复刻这款热门游戏的自动攻击与海量刷怪机制。

weixin_30721077的博客 458

【原创】KM算法的Bfs写法

KM算法的Bfs写法引入–DfsKM的时间复杂度我们已经学习了KM算法,现在我们来分析一下它的时间复杂度。bool dfs(int s) { visx[s]=1; for(int i=1;i<=cnty;i++) if(!visy[i]) { int t=wx[s]+wy[i]-dis[s][i]; i

致上 6466

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 155

二分图的最佳完美匹配--KM算法(DFS寻路+BFS寻路(O(n^3))) + HDU2255入门题

Reference Blog: 原理清晰深刻:https://blog.youkuaiyun.com/sixdaycoder/article/details/47720471 较容易于理解:https://www.cnblogs.com/wenruo/p/5264235.html 如果二分图的每条边都有一个权(可以是负数),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最佳完美匹配。(特殊的...

Dave_lzw的博客 2364

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1764

[KM算法 O(n^ 3) ] 带权二分图最大匹配

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18257Accepted Submission(s): 7702 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长...

博客 376

PLc S7-200 smart如何使用Modbus 485通讯传输接收数据

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器,从而实现PLC通过modbus方式控制其他器件。提示:以下是本篇文章正文内容,下面案例可供参考。

xjbsw0的博客 6万+

KM算法精解:从二分图最大权匹配到O(N^3)实现与实战优化

二分图最大权匹配是图论中的经典问题,旨在为两组互不相连的节点(如任务与执行者)寻找最优的一对一配对方案,使得所有配对边的权重之和最大。其核心原理在于通过全局优化而非局部贪心,解决资源有限下的分配冲突。KM算法(Kuhn-Munkres算法)通过引入顶标和相等子图的概念,在多项式时间内高效求解该问题,具有重要的技术价值。它在资源调度、广告推荐、任务分配等需要全局最优配对的工程场景中应用广泛。本文深入解析了KM算法的核心思想,特别是顶标调整与相等子图协同工作的精妙机制,并提供了O(N^3)时间复杂度的优化实现代

weixin_30889885的博客 492

Ubuntu 24.04 + RTX 5090 部署 OpenVLA-OFT:从环境配置到机器人任务评估实战

本文详细记录了在Ubuntu 24.04 LTS系统上,为全新RTX 5090显卡配置CUDA 12.8+与PyTorch 2.7.1+开发环境,并成功部署OpenVLA-OFT视觉语言模型进行机器人任务评估的完整实战流程。文章重点解决了驱动安装、依赖版本冲突、路径设置等核心难题,为在最新硬件上运行先进AI机器人模型提供了可靠的避坑指南和性能观察。

n8m7b6v5c4的博客 594

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1036

二分图最佳匹配(KM算法)学习笔记

KM算法 学习这个之前先要了解几种二分图匹配的区别,这里就不说了,可以看看这篇博客 博客 先上道模板题:HDU 2255 奔小康赚大钱 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。 这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到...

不知所云的博客 1035

高通开发系列 - Linux/Ubuntu移植到QCS8xxx平台

QCS8250和QRB5165平台属于体系架构相同的芯片,前置是带cellular而后者不带,即前置有移动网络而后者没有。 BSP部分的软件内容有差异需要修改外,同一套代码编译出来的执行程序是可以运行的,不会存在体系架构、指令集不匹配的问题。 QCS8250平台没有Linux/Ubuntu的软件SDK,只有Android的SDK,但是它对应j兼容的QRB5165平台有LE(Linux)和Ubun(Ubuntu)SDK。所以我们需要做的就是用QRB5165 Linux/Ubuntu移植到QCS8250平台上来

fulinux的博客 3185

二分图最大权匹配(完美匹配)——KM算法模板(dfs版O(n^4) + bfs版O(n^3))

写在前面: 考虑到二分图中两个集合中的点并不总是相同,为了能应用 KM算法解决二分图的最大权匹配,需要先作如下处理: 将两个集合中点数比较少的补点,使得两边点数相同,再将不存在的边权重设为 0,这种情况下,问题就转换成求最大权完美匹配问题 ,从而能应用KM算法求解。 具体算法流程: (1)分配可行顶标,对每个顶标执行(2)(3)(4) (2)匈牙利算法找到增广路 (3)找不到增广路就调整顶标。 (4)重复(2),(3)直到找到增广路 模板题:P6577 【模板】二分图最大权完美匹配 DFS版本: #incl

weixin_45925735的博客 1017

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二分图匹配(KM算法)n^3 分类: ACM TYPE ...

#include <iostream> #include<cstring> #include<cstdio> #include<cmath> const int maxn = 301; const int INF = (1<<31)-1; int w[maxn][maxn]; int lx[maxn],ly[maxn]; //顶标...

weixin_34418883的博客 104

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【图论】二分图匹配(Hungary算法&KM算法&hopcroft-karp算法)

O(n^3)的板子: #include<bits/stdc++.h> #define ll long long #define endl '\n' #define mem(a) memset(a,0,sizeof(a)) #define IO ios::sync_with_stdio(false);cin.tie(0); using namespace std; const int I...

Rainfoo的博客 698

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

KM bfs写法

KM bfs写法 2018astar资格赛的第三题整数规划。 把\(x, y\)看成二分图两边的顶标,\(a_{ij}\)就是二分图的边权,整道题其实就是求二分图的最大权匹配。 然后打了个\(dfs\)的\(KM\),\(TLE\)了,后来听别人说要用\(bfs\)的写法,因为那个才是真正的\(O(n^3)\),\(dfs\)的写法最坏情况还是\(O(n^4)\)。 原理是一样的,只不过...

diebenger6280的博客 437

【KM算法】HDU2255-奔小康赚大钱

KM算法的裸体。O(n^4)的模板,实际上在增广路径的时候依然有冗余,可以用bfs优化到O(n^3)。 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib&gt...

dianchunhui2654的博客 121

KM算法详解:从二分图最大权匹配到资源调度实战

在组合优化与图论领域,二分图匹配是解决资源分配、任务调度等问题的经典模型。其核心原理是在两个不相交的顶点集合间建立对应关系,以达成某种最优目标。当匹配的边被赋予权重(如成本、收益)时,问题便升级为带权二分图匹配,这在实际工程中具有极高的技术价值,例如在云计算任务调度、在线广告竞价、人员排班等场景中优化整体效益。KM算法(Kuhn-Munkres算法)正是解决此类最大权完美匹配问题的核心算法。它通过引入顶标和相等子图的巧妙构造,将复杂的带权问题转化为经典的无权匹配问题迭代求解,兼具理论美感与工程实用性。本文将

weixin_30905133的博客 366

HDU - 2255 奔小康赚大钱 二分图最佳完美匹配——KM算法

题目链接 题意: nnn 个村民, nnn 个房间,第 iii 个村民对应第 jjj 个房间都有个收益 wi,jw_{i,j}wi,j​ ,且一个房间只能给一个村民,现在给这些村民分配房间,求获得的最大的收益值。 思路:很明显这是个二分图,与普通二分图不同的是这个是边带权的二分图。看题意即为求该二分图的一个完备匹配,其所有匹配边的和在所有完备匹配中最大,即为求二分图最佳完美匹配。 KM算法(专门用...

a302549450的博客 344

KM算法详解和其更快优化方法(吊打传统的slack优化)

网上的KM算法slack优化都是假的O(n^3),实际上是O(n^4)的。本文讲了自己脑补的算法吊打slack优化,并做题目比较时间验证。

sidnee的博客 7796
上一篇: 二分图匹配
下一篇: 二分图匹配(KM算法)n^4
梁千仞
博客等级 码龄15年 12粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值