当前位置: 首页 > news >正文

图论---匈牙利算法求二分图最大匹配的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质:

程序流程图:

数学原理:

        求解二分图最大匹配问题的算法,寻找一个边的子集,使得每个左部点都与右部点相连,并且没有两条边共享相同的端点。使用深度优先搜索来寻找增广路径。当找到一条增广路径时,将路径上的边加入匹配集合中,并更新匹配状态。重复这个过程直到无法找到增广路径为止。

时间复杂度分析:

        时间消耗来自于DFS搜索和增广路径的寻找。对于每个左侧未匹配的点u,需要进行一次DFS搜索。在最坏情况下,DFS搜索需要遍历所有的右侧点,因此时间复杂度为O(n)。由于需要进行n次DFS搜索,所以时间复杂度为O(n^2)。

源代码:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;const int MAXN = 505; // 最大顶点数
int n, m, k; // n为左部点数,m为右部点数,k为总变数
vector<int> G[MAXN]; // 邻接表表示二分图
int match[MAXN]; // match[i]表示右边第i个点匹配的是左边的哪点,如果没有匹配则为-1
bool vis[MAXN]; // DFS中标记右边各点是否已经被访问过
//进行深度搜索最大匹配边
bool dfs(int u) {int i;for (i = 0; i < G[u].size(); i++) {int v = G[u][i];if (!vis[v]) {vis[v] = true;if (match[v] == -1 || dfs(match[v])) {match[v] = u;//对边进行存储return true;}}}return false;
}
//匈牙利算法
int hungarian() {int res = 0;memset(match, -1, sizeof(match));for (int i = 1; i <= n; i++) {memset(vis, false, sizeof(vis));if (dfs(i)) res++;}return res;
}
int main() {cin >> n >> m >> k; // 输入左部点数和右部点数int u, v;int i=0;for(;i<k;i++){cin >> u >> v ; // 输入边 (u, v),u属于左部,v属于右部G[u].push_back(v);}int max_matches = hungarian(); // 计算最大匹配数cout << "最大匹配边数:" << max_matches << endl;// 输出最大匹配数// 输出最大匹配的所有边cout << "最大匹配边为:" << endl;for (int v = 1; v <= m; v++) {if (match[v] != -1) { // 如果右部点v有匹配cout << "Edge: " << match[v] << " - " << v <<endl; // 输出匹配边}}system("pause");return 0;
}

测试用例:(两侧顶点数均大于10,且两侧顶点数不相等)

输出结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pdf只要前几页,pdf中只要前几页怎么处理
  • pytorch-pytorch之LSTM
  • DockerCompose介绍,安装,使用
  • 【错题集-编程题】四个选项(DFS + 剪枝 + 哈希表)
  • 利用 AI 解放双手:把“贾维斯”带进现实 | 开源专题 No.64
  • 拥抱UniHttp,规范Http接口对接之旅
  • 基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现
  • wxml与标准的html的异同
  • NLP任务:情感分析、看图说话
  • 防御第二次作业完成接口配置实验
  • 如何在PostgreSQL正确的 使用UUID 作为主键
  • 虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理
  • ES6 Module 的语法(十二)
  • ubuntu服务器安装labelimg报错记录
  • vue父组件样式穿透修改子组件样式
  • (三)从jvm层面了解线程的启动和停止
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CSS居中完全指南——构建CSS居中决策树
  • golang 发送GET和POST示例
  • Idea+maven+scala构建包并在spark on yarn 运行
  • React+TypeScript入门
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊一聊前端的监控
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 使用docker-compose进行多节点部署
  • 我从编程教室毕业
  • postgresql行列转换函数
  • 如何正确理解,内页权重高于首页?
  • ​​​【收录 Hello 算法】9.4 小结
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ###C语言程序设计-----C语言学习(6)#
  • #07【面试问题整理】嵌入式软件工程师
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • (145)光线追踪距离场柔和阴影
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (四)模仿学习-完成后台管理页面查询
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)原始图像数据和PDF中的图像数据
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET 中创建支持集合初始化器的类型
  • .NET文档生成工具ADB使用图文教程
  • //解决validator验证插件多个name相同只验证第一的问题
  • /proc/vmstat 详解
  • [100天算法】-二叉树剪枝(day 48)
  • [100天算法】-实现 strStr()(day 52)
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2021 蓝帽杯] One Pointer PHP
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#]实现GRPC通讯的服务端和客户端实例