首页 > 编程语言 >匈牙利算法

匈牙利算法

时间:2024-12-24 19:08:56浏览次数:4  
标签:二分 匹配 int 匈牙利 算法 右部点 match

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

咳咳,匈牙利算法是一种常用于求二分图最大匹配的高效算法,将暴力的指数级算法进化到多项式复杂度,如果用邻接表存图,最坏时间复杂度为O(nm)。

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

‌二分图最大匹配‌是指在二分图中,所有匹配中包含最多匹配边的匹配。在二分图中,顶点被分为两个互不相交的子集,图中的每条边连接这两个子集的顶点。最大匹配是指在一个图中所有可能的匹配中,匹配边数最多的匹配。‌其中,一个匹配中所有边互不相交,即没有公共点。

二分图最小点覆盖是指选出最少数量的点,构成点集V ,二分图中的每条边都至少有一个顶点在点集V中。

二分图最大独立集是指在二分图的点全集V中,选出最多数量的点,使得这些点在原图中互相没有边联通。

这里给出一些变换公式:

以下设二分图的点全集为V。

最小点覆盖=最大匹配。

最大独立集=|V|-最小点覆盖=|V|-最大匹配

笔者认为,匈牙利算法的主要流程是这样:从左部点(或右)枚举每个点,将这个点与有边联通的右部点匹配,如果右部点已经有匹配,继续判断这个匹配能不能和另外一个右部点匹配。

以上是基于深度优先的匈牙利算法。

下面附上模板题

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int n, m, E;
vector <int> e[N];//动态数组存图
int vis[N], match[N];//vis表示这个右部点是否被访问过,match表示这个右部点的匹配
int path(int u)
{
	for (int v : e[u])
	{
		if (!vis[v])//记录vis是为了防止后续重复访问,影响正确性
		{
			vis[v] = 1;
			if (!match[v] || path(match[v]))//如果右部点还没有匹配,或者其匹配可以匹配别的匹配()
			{
				match[v] = u;//更新匹配
				return 1;
			}
		}
	}
	return 0;
}
void mian()
{
	cin >> n >> m >> E;
	int u, v;
	for (int i = 1; i <= E; i ++)
	{
		cin >> u >> v;
		e[u].push_back(v);
	}
	int ans = 0;
	for (int i = 1; i <= n; i ++)
	{
		if (path(i)) ans ++;
		memset(vis, 0, sizeof(vis));//每次枚举完都要清空
	}
	cout << ans << endl;
}
int main()
{
	int T = 1;
	while (T --) mian();
	return 0;
}

标签:二分,匹配,int,匈牙利,算法,右部点,match
From: https://www.cnblogs.com/Lion-Wu/p/18628526

相关文章

  • 常见的机器学习算法,包含监督学习、无监督学习、半监督学习和强化学习
    一、监督学习算法(约70个)线性回归(LinearRegression)简单线性回归:用于建立一个自变量和一个因变量之间的线性关系,例如根据房屋面积预测房价,其模型表达式为\(y=\beta_0+\beta_1x+\epsilon\),其中\(y\)是因变量(房价),\(x\)是自变量(房屋面积),\(\beta_0\)和\(\beta_1\)是模型参数,\(\ep......
  • 机器学习全解析:基础概念、任务类型、算法模型、应用及未来挑战与走向
    一、引言机器学习作为人工智能领域的核心分支,旨在让计算机系统从数据中自动学习模式和规律,以实现对未知数据的预测和决策。在当今数字化时代,机器学习已经广泛应用于各个领域,从图像识别、语音识别到金融预测、医疗诊断等,为解决复杂问题提供了强大的工具和方法。二、机器学习基础......
  • 代码随想录算法训练营第二十九天|134加油站、135分发糖果、860柠檬水找零、406根据身
    day29贪心算法part031.134加油站解题思路:(1)总体条件判断:如果gas数组的总和小于cost数组的总和,则无论从哪个加油站出发,汽油都不足以完成一圈,返回-1。(2)寻找起点:设定两个变量:total_tank:总剩余汽油量,表示从头到尾累计整个数组的油量差,目的是判断总的油量......
  • 隐马尔科夫模型|前向算法|Viterbi 算法
    隐马尔可夫模型(HiddenMarkovModel,HMM)HMM是一种统计模型,用于表示由一个隐藏的马尔可夫链生成的观测序列。它假设每个观测值依赖于当前的隐藏状态,并且隐藏状态之间的转换遵循马尔可夫性质(即未来的状态仅依赖于当前状态,而不受过去状态的影响)。HMM通常包含以下三个基......
  • 二分算法
    @目录二分算法基本介绍应用场景例题进击的奶牛小红打怪总结二分算法基本介绍二分查找算法(BinarySearch)是一种高效的查找算法,特别适用于在有序数组或列表中快速定位目标元素。它利用了分治法的思想,每次查找都将搜索范围缩小一半,因此时间复杂度为O(logn),效率非常高。应用场景......
  • 算法网关视频分析网关小知识:监控系统频繁掉线,如何排查网络问题?
    在现代监控系统中,网络稳定性对于确保视频流的连续性和图像质量至关重要。然而,监控系统频繁掉线是一个常见的问题,它可能由多种因素引起,包括硬件故障、网络配置错误、供电不稳定等。为了有效排查和解决这些问题,以下是一些系统性的步骤,可以帮助我们定位并解决监控系统掉线的问题。1......
  • 分治策略——算法学习(二)
    分治策略——算法学习(二)前言在算法设计的世界中,分治策略(DivideandConquer)是一种极具魅力的思想,它通过将复杂问题拆解为多个规模较小但结构类似的子问题,从而以递归的方式解决问题。这种策略不仅高效而且直观,为许多经典算法的诞生奠定了基础,如快速排序(QuickSort)、归并排序(Merg......
  • 每日一算法----设计链表(java)
    classMyLinkedList{staticclassListNode{intval;intindex;ListNodeprev;ListNodenext;publicListNode(intval,intindex,ListNodeprev,ListNodenext){this.val=val;this.in......
  • 大邻域搜索算法
    大邻域搜索算法(LargeNeighborhoodSearch,LNS)是一种用于求解组合优化问题的启发式算法。以下是对大邻域搜索算法的详细解释:一、基本概念大邻域搜索算法中的“大”指的是邻域变动的范围相对于一般的邻域搜索算法而言更广。该算法的核心思想是在一个比较大的解空间邻域内寻找更好......
  • 变邻域搜索算法
    变邻域搜索算法(VariableNeighborhoodSearch,VNS)是一种基于局部搜索的启发式算法,它通过在不同的邻域结构之间切换来逃避局部最优解,并逐步改进解的质量。以下是对变邻域搜索算法的详细解释:一、算法原理变邻域搜索算法的基本思想是在搜索过程中系统地改变邻域结构集来拓展搜索范围......