0

0

C++怎么实现匈牙利算法_C++二分图最大匹配【匹配】

冰火之心

冰火之心

发布时间:2026-02-28 10:43:03

|

119人浏览过

|

来源于php中文网

原创

匈牙利算法核心是dfs/bfs找增广路以增广匹配,需正确初始化match[]为-1、每轮重置used[],通过递归尝试腾位更新match[y]=x;邻接表优于邻接矩阵,注意边方向与下标统一。

c++怎么实现匈牙利算法_c++二分图最大匹配【匹配】

匈牙利算法的核心是“找增广路”,不是暴力枚举

直接写个双重循环试图穷举所有匹配,会超时或错解。匈牙利算法本质是 DFS/BFS 在二分图上反复寻找一条能翻转当前匹配状态的路径——即增广路。只要找到一条,匹配数就 +1;找不到,当前匹配就是最大匹配。

常见错误现象:match[y] = -1 初始没设对,导致第一次就跳过有效点;或者 DFS 返回 true 后没更新 match[y]used[x],结果匹配数卡在 0 或偏小。

  • 必须初始化 match[] 数组为 -1(表示未匹配),不能用 0
  • 每次 DFS 前重置 used[](仅限当前轮次的左部点访问标记)
  • DFS 函数返回 bool:找到增广路就返回 true,并在回溯中更新 match[y]match[x]

DFS 版匈牙利算法模板要避开递归栈溢出和重复访问

当左部点数量大(比如 1e4)、图又稠密时,纯递归 DFS 容易爆栈或 TLE。关键不是“写得短”,而是控制访问边界和剪枝逻辑。

使用场景:稀疏二分图、左部点 ≤ 5000、需要代码简洁可读;不适用于左部点带权或要求字典序最小匹配。

立即学习C++免费学习笔记(深入)”;

Daft Art
Daft Art

AI专辑封面图片生成器

下载
bool dfs(int x) {
    for (int y : graph[x]) {
        if (used[y]) continue;
        used[y] = true;
        if (match[y] == -1 || dfs(match[y])) {
            match[y] = x;
            return true;
        }
    }
    return false;
}
  • used[y] 是右部点标记,每轮 DFS 前 memset 为 false,不能复用上一轮
  • match[y] == -1 是终止条件之一,代表 y 尚未匹配,可直接占用
  • 递归调用 dfs(match[y]) 是关键:尝试把原来匹配 y 的左部点 match[y] “腾”出来,给 x 让位

邻接表 vs 邻接矩阵:图存法直接影响性能和内存

邻接矩阵(vector<vector>> g</vector>)看似直观,但空间 O(V²),且遍历每个右部点都要扫满列,实际复杂度接近 O(n³)。邻接表才是标配。

参数差异:graph[x] 存的是所有与左部点 x 相连的右部点编号(从 0 开始或 1 开始需统一),不是边权也不是是否可达。

  • 右部点总数记作 m,左部点总数记作 n,数组 match 长度应为 m,下标对应右部点编号
  • 若输入是 1-indexed 边(如 u v 表示左部 u 连右部 v),存图时记得 graph[u-1].push_back(v-1)
  • 不要在 DFS 里反复调用 graph[x].size(),提前存进变量避免多次计算

匹配失败时 debug 要看三处:match 初始化、used 复位、图边方向

最常被忽略的是边方向反了——把右部点当成起点去连左部点,或者误以为 match[x] 存左部匹配,其实标准写法里 match[y] 才存右部点 y 匹配的左部点 x。

错误信息典型表现:match[y] 始终为 -1(图没建对)、dfs() 永远返回 false(used 没清或初始值错)、程序运行后匹配数为 0(左部点编号越界导致图没存进去)。

  • 打印前几条边验证 graph[0] 是否非空,确认建图成功
  • 检查 match 数组长度是否等于右部点总数,下标是否越界
  • 确保 used 数组大小 ≥ 右部点总数,且每次调用 dfs 前用 memset(used, 0, sizeof used)fill
事情说清了就结束

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

429

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

599

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

479

2023.08.14

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

0

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

0

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

0

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

51

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

4

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

45

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号