匈牙利算法

匈牙利算法:是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法

时间复杂度:O(nm)

适用场景:二分图的最大匹配

核心思想:增广路径,即当左边集合的点1匹配右边的点2为已匹配时,会找到上一个左边指向该右边已匹配点2的节点3,并尝试将该节点3转向另一个节点4,若果节点4也匹配则重复该操作,如果未匹配则称这条新路径为增广路径

二分图:又称作二部图,是图论中的一种特殊模型。图中的所有顶点可以分为两个集合,集合内部没有边存在,边只存在于集合之间,即所有边的顶点分别属于不同集合

二分图特性:二分图一定不含有奇数环

二分图只有偶数环,因为只有偶数环才可以保证成环的条件下还能保证在同一个集合内的环节点没有边存在,而奇数环的出现说明在这个环中至少有两个节点是在同一集合内,并且它们之间还存在边

最大匹配:每条边的两端都是不同集合的节点,在节点不重复的情况下,边数最多

参考代码:

例题:二分图的最大匹配​​​​​​​

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//题目给定的点数、边数限制
const int N = 510, M = 100010;
//输入的左边集合点数n1,右边集合点数n2以及边数m
int n1,n2,m;
//存储边数的邻接表
int h[N],e[M],ne[M],idx;
//下标表示右边集合节点x,其值表示左边集合节点y
int match[N];
//存储右边集合是否已匹配
bool st[N];void add(int a,int b){e[idx] = b;ne[idx] = h[a];h[a] = idx;idx ++ ;
}bool find(int x){//对传入的节点进行遍历所有可匹配的右边点for(int i = h[x] ; i != -1 ; i = ne[i]){int j = e[i];//如果右边节点未匹配if(!st[j]){//则将右边节点设为已匹配st[j] = true;//如果右边节点为未匹配或者为右边节点的现任节点找到新的匹配点if(match[j] == 0 || find(match[j])){//将右边节点的匹配对象换成自己match[j] = x;//返回配对成功return true;}}}//返回配对失败return false;
}int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin >> n1 >> n2 >> m;int a,b;memset(h,-1,sizeof h);while (m--){cin >> a >> b;//仅需存储从左到右的边即可,只对左边集合节点进行操作add(a,b);}//存储匹配数int res;//对左边集合的节点进行遍历for(int i = 1 ; i <= n1 ; i++){memset(st,false,sizeof st);if(find(i)){res++;}}cout << res << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPv6扩展头(四)——分片头

分片头部&#xff08;Fragment Header&#xff09;用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。 一、优势 IPv6 分片头具有多种优势&#xff0c;可提高网络效率&#xff0c;包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头&#xff0c;数据包在源处而不是中间…

光谱整形1

华为张德江&#xff1a;下一代光传送网将走向400G80波WDM系统_通信世界网 (cww.net.cn) 张德江指出&#xff0c;400G WDM系统具有三大基本特征&#xff1a;支持400G80波&#xff0c;单纤32T超大容量&#xff0c;传输距离与100G相当&#xff1b;支持32维以上的光交叉&#xff1…

Python实例☞数据类型及运算符案例

实例一&#xff1a; ❶要求☞从键盘获取一个4位整数&#xff0c;并分别输出个、十、百、千位 ❷程序代码☞ ①第一种方法 print(请输入一个4位整数&#xff1a;) xeval(input()) print(个位数为&#xff1a;,x%10) print(十位数为&#xff1a;,(x//10)%10) print(百位数为&am…

4.1k star,官方出品的redis桌面管理工具——redislnsight

导航 令人抓狂的大key加载RedisInsight 简介RedisInsight的亮点GitHub 地址安装和使用RedisInsight 下载安装 使用RedisInsight redis数据库可视化直观的CLI&#xff08;Command-Line Interface&#xff09;日志分析和命令分析 结语参考 令人抓狂的大key加载 工欲善其事必先利…

利用GPT开发应用003:GPT分词和预测

文章目录 一、概率问题二、令牌&#xff08;分词&#xff09;三、预测 一、概率问题 像 GPT 这样的大型语言模型接收一个提示&#xff0c;并返回通常在上下文中有意义的输出。例如&#xff0c;提示可以是“今天天气很好&#xff0c;所以我决定”&#xff08;“The weather is n…

检测螺栓扭矩的方法有哪些——SunTorque智能扭矩系统

螺栓扭矩的检测是确保螺栓连接紧固程度和安全性的重要环节。正确的扭矩检测能够预防螺栓松动、断裂等潜在风险&#xff0c;从而保障设备和结构的稳定运行。SunTorque智能扭矩系统接下来将详细介绍螺栓扭矩的检测方法。 螺栓扭矩的检测是确保螺栓连接紧固程度和安全性的重要环节…

什么是VR全息投影技术|元宇宙文旅|VR设备购买

VR全息投影技术是一种结合了虚拟现实&#xff08;VR&#xff09;和全息投影技术的创新技术&#xff0c;旨在创造出更加沉浸式和真实感的体验。 在这种技术中&#xff0c;用户可以通过戴上特殊的头戴式显示器&#xff08;如VR头显&#xff09;进入虚拟现实世界&#xff0c;同时通…

Spark Core

Spark Core 一、Spark RDD RDD概述 1.RDD基础 2.RDD源代码描述 3.RDD特性 4.Spark宽窄依赖 RDD创建 在驱动器中创建RDD 1.parallelize 读取外部数据集创建RDD 2.textFile RDD操作 缓存rdd到内存 1.RDD转化操作 2.常见的转化操作 3.RDD行动操作 4.常见的行动操作 Spark…

HTTP协议(请求方式,响应方式,请求行、头、体,状态码)是热点面试题【详解】

目录 1. HTTP简介 1.介绍 2.浏览器抓包 3.特点 2. HTTP请求 1.HTTP请求的格式 2.HTTP请求方式 3.GET方式的请求示例 请求行 请求头 请求体 4.POST方式的请求示例 请求行 请求头 请求体 GET和POST的区别 5.HTTP响应 1.HTTP响应的格式 2 常见响应头 3 响应…

企业财务分析该怎么做?重点分析哪些财务指标?

在企业经营管理的过程中&#xff0c;财务分析是评估当前企业或特定部门财务状况和绩效的过程&#xff0c;这一过程通常涉及对财务报表&#xff08;如资产负债表、利润表和现金流量表&#xff09;进行定量和定性的评估&#xff0c;以便为盈利能力、偿债能力、现金流动性和资金稳…

【计算机系统】2.进程管理

【计算机系统】2.进程管理 这个章节十分的重要&#xff0c;作业也要好好做&#xff0c;因为我学的是后端&#xff0c;学计算机进程的处理对于搞并发来说十分有用。 提出问题 6、试从动态性、并发性和独立性上比较进程和程序。19、为什么要在OS中引入线程?A.请用信号量解决以下…

如何搭建财务数据运营体系:基于财务五力模型的分析

在当今复杂多变的商业环境中,财务数据作为企业决策的重要参考依据,其运营体系的搭建显得尤为关键。一个健全、高效的财务数据运营体系不仅能够为企业提供准确的财务数据支持,还能帮助企业在激烈的市场竞争中保持领先地位。基于财务五力模型的分析,我们可以从收益力、安定力…