C#,图论与图算法,二分图(Bipartite Graph)最佳二分匹配(Maximum Bipartite Matching)算法与源程序

article/2025/10/26 6:59:35

二部图中的匹配是一组边的选择方式,使两条边不共享一个端点。最大匹配是最大大小(最大边数)的匹配。在最大匹配中,如果向其添加任何边,则该边不再是匹配。对于给定的二部图,可以有多个最大匹配。

我们为什么在乎?

现实世界中有许多问题可以形成为二部匹配。例如,考虑以下问题:

“共有M个求职者和N个职位。每个求职者都有一部分他/她感兴趣的职位。每个职位空缺只能接受一个求职者,而一个求职者只能被任命一个职位。在中为求职者分配职位,以便尽可能多的求职者获得工作。”

我们强烈建议您先阅读以下帖子。“最大流问题的Ford-Fulkerson算法”

最大二部匹配和最大流问题:

最大二部匹配(MBP)问题可以通过将其转换为流网络来解决(请参阅此视频了解我们是如何得出此结论的)。以下是步骤。


最大匹配2

1) 构建流网络:流网络中必须有源和汇。因此,我们向所有申请者添加一个源,并从源添加边。类似地,将所有作业的边添加到接收器。每条边的容量标记为1个单位。

最大匹配2

2) 查找最大流量:我们使用Ford Fulkerson算法在步骤1中构建的流量网络中查找最大流量。最大流量实际上是我们正在寻找的MBP。

如何实施上述方法?

让我们首先定义输入和输出表单。输入采用Edmonds矩阵的形式,该矩阵是一个2D数组“bpGraph[M][N]”,其中有M行(针对M个求职者)和N列(针对N个工作)。如果第i个申请人对第j个工作感兴趣,则bpGraph[i][j]的值为1,否则为0。

输出是能找到工作的最大人数。

实现这一点的一种简单方法是创建一个矩阵,该矩阵表示具有M+N+2个顶点的有向图的邻接矩阵表示。为矩阵调用fordFulkerson()。此实现需要O((M+N)*(M+N))额外空间。

利用图是二部图且每条边的容量为0或1的事实,可以减少额外空间并简化代码。其想法是使用DFS遍历为申请人找到一份工作(类似于福特·富尔克森(FordFulkerson)中的扩充路径)。我们为每个申请者调用bpm(),bpm()是一个基于DFS的函数,它尝试所有可能的方法来为申请者分配工作。

在bpm()中,我们会一个接一个地尝试申请人“u”感兴趣的所有工作,直到我们找到一份工作,或者所有工作都是在运气不佳的情况下尝试的。对于我们尝试的每一项工作,我们都会遵循以下原则。

如果工作没有分配给任何人,我们只需将其分配给申请人并返回true。如果一个作业分配给了其他人,比如x,那么我们递归地检查x是否可以分配给其他作业。为了确保x不再获得相同的工作,我们在递归调用x之前将作业标记为“v”。如果x可以获得其他作业,我们将更改作业“v”的申请人并返回true。我们使用一个数组maxR[0..N-1],它存储分配给不同工作的申请者。

如果bmp()返回true,则表示流网络中有一个扩充路径,并且在maxBPM()中的结果中添加了1个流单元。

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{private static bool Maximum_Bipartite_Matching_Utility(bool[,] bpGraph, int u, bool[] seen, int[] matchR){int N = bpGraph.GetLength(1);for (int v = 0; v < N; v++){if (bpGraph[u, v] && !seen[v]){seen[v] = true;if (matchR[v] < 0 || Maximum_Bipartite_Matching_Utility(bpGraph, matchR[v], seen, matchR)){matchR[v] = u;return true;}}}return false;}public static int Maximum_Bipartite_Matching(bool[,] bpGraph){int M = bpGraph.GetLength(0);int N = bpGraph.GetLength(1);int[] matchR = new int[N];for (int i = 0; i < N; i++){matchR[i] = -1;}int result = 0;for (int u = 0; u < M; u++){bool[] seen = new bool[N];for (int i = 0; i < N; i++){seen[i] = false;}if (Maximum_Bipartite_Matching_Utility(bpGraph, u, seen, matchR)){result++;}}return result;}}public static partial class GalleryDrive{public static string MBM(){bool[,] bpGraph = new bool[,] {{ false,  true,  true, false, false, false },{ true,  false, false,  true, false, false },{ false, false,  true, false, false, false },{ false, false,  true,  true, false, false },{ false, false, false, false, false, false },{ false, false, false, false, false,  true }};return ("Maximum number of applicants that can get job is " + Algorithm_Gallery.Maximum_Bipartite_Matching(bpGraph));}}
}


http://chatgpt.dhexx.cn/article/w8dd3GLM.shtml

相关文章

【论文精读】Bipartite network projection and personal recommendation

一、Introduction 在过去的几年里&#xff0c;人们对复杂网络进行了大量的研究&#xff0c;一类特殊的网络是二部网络&#xff08;bipartite network&#xff09;。特点是其节点可分割为两个互不相交的子集X和Y&#xff0c;连接只允许存在于不同集合中两个节点之间。例如人类的…

【一致性仿真】Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions

文章链接&#xff1a;Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions 仿真图Fig3&#xff1a; MATLAB代码 % Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions % Protocol Simulation Results …

C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序

二分图Bipartite graph 有没有可能通过数学过程找到你的灵魂伴侣&#xff1f;大概让我们一起探索吧&#xff01; 假设有两组人注册了约会服务。在他们注册后&#xff0c;会向他们展示另一组人的图像并给出他们的描述。他们被要求选择他们愿意与之匹配的人。 所有信息都被输入…

[VLDB 2022]Butterfly Counting on Uncertain Bipartite Graphs

总结 非确定二部图上的蝴蝶结构统计&#xff0c;精确算法。在普通的蝴蝶结构统计上&#xff0c;增加了边权重&#xff0c;使得传统算法失效&#xff0c;再在这基础上定义新的统计并优化老方法。 动机 Butterfly的数量直接展示了二部图的密度&#xff0c;是个很重要的属性。相…

二分匹配大总结——Bipartite Graph Matchings[LnJJF]

文章目录 二分匹配——Bipartite Graph Matchings[LnJJF]认识&#xff1a;什么是二分图&#xff1f;理解&#xff1a;现实模型如何与二分图相互转化&#xff1f;如何判断能否转化&#xff1f;能够转化的话&#xff0c;如何转化&#xff1f; 应用&#xff1a;已知一个二分图&…

【一致性仿真】Fixed-time bipartite consensus of multi-agent systems with disturbances

文章链接&#xff1a;Fixed-time bipartite consensus of multi-agent systems with disturbances 仿真图Fig2&#xff1a; MATLAB代码&#xff1a; % Fixed-time bipartite consensus of multi-agent systems with disturbances % author:JCGUY % date:2022-04-20 clear clc…

Bipartite Graph多视图学习聚类文章总结

看了一些anchor graph和bipartite graph 的文章始终不知道他们的区别在哪里。今天总结一下这类文章。 1.能看到最早的这类关于多视图学习的文章 Large-Scale Multi-View Spectral Clustering via Bipartite Graph&#xff08;AAAI-2015&#xff09; 目标&#xff1a;we addre…

Fast spectral clustering learning with hierarchical bipartite graph for large-scale data

Fast spectral clustering learning with hierarchical bipartite graph for large-scale data 基于层次二分图的大规模数据快速谱聚类学习 abstract 传统方法&#xff1a;不适用大规模问题 高斯核函数 提出了一种新的基于层次二分图&#xff08;SCHBG&#xff09;的光谱聚…

Bipartite Graph Based Multi-View Clustering

Bipartite Graph Based Multi-View Clustering 基于二部图的多视图聚类 abstract 对于基于图的多视图聚类&#xff0c;一个关键问题是通过两阶段学习方案捕获共识聚类结构。具体来说&#xff0c;首先学习多个视图的相似性图矩阵&#xff0c;然后将它们融合为统一的高级图矩阵。…

BiNE: Bipartite Network Embedding

** BiNE: Bipartite Network Embedding ** SIGIR 2018 论文链接&#xff1a;https://dl.acm.org/doi/10.1145/3209978.3209987 项目代码&#xff1a;https://github.com/clhchtcjj/BiNE 文章目录 BiNE: Bipartite Network Embedding 摘要1、Introduction2、Related work&a…

【Paper】2020_Event-triggered bipartite consensus over cooperation-competition networks under DoS atta

Hu, A., Park, J.H., Cao, J. et al. Event-triggered bipartite consensus over cooperation-competition networks under DoS attacks. Sci. China Technol. Sci. 64, 157–168 (2021). 文章目录 1 Introduction2 Problem description and preliminaries2.1 Multiagent model…

Bipartite graph/network学习

Bipartite graph/network翻译过来就是&#xff1a;二分图。 维基百科中对二分图的介绍为&#xff1a;二分图是一类图(G,E)&#xff0c;其中G是顶点的集合&#xff0c;E为边的集合&#xff0c;并且G可以分成两个不相交的集合U和V&#xff0c;E中的任意一条边的一个顶点属于集合…

bipartite matching二分图匹配

目录 二分图bipartite的概念 匹配的概念 最大匹配 bipartite matching 这个词最近在看Transformer相关的论文里常见用作loss function,所以特地学习一下&#xff0c;bipartite matching是一个什么操作。个人理解&#xff0c;若有表述错误或不当的问题&#xff0c;还请各位大…

【嵌入式单元测试】C语言单元测试框架搭建

cmocka cmocka交叉编译源码下载 编译准备源码修改指定编译器编译 cmocka使用示例常见问题参考 单元测试框架是一个软件包&#xff0c;它能够让开发者比较方便的表达产品代码需要表现出什么样的行为。单元测试框架提供了一个自动化单元测试的解决方案&#xff0c;让开发者把更多…

三年黑盒测试工程师,带你了解嵌入式测试,金三银四升职加薪秘诀

什么是嵌入式系统? 嵌入式系统是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”。 嵌入式系统是“用于控制,监视或辅助操作机器和设备的装置”。 嵌入式系统还可以定义为“以应用为中心,以计算机技术为基础,软硬件可裁剪,功能、可靠性、成本、体积、功耗…

嵌入式软件测试的小结

文章内容为本人这三年来在嵌入式软件测试&#xff08;黑盒&#xff09;上的一些积累吧&#xff0c;说起来也挺快的&#xff0c;毕业三年的时间就这样过去了&#xff0c;在两家公司工作过&#xff08;现在这家是第二家&#xff09;&#xff0c;这几年的测试项目基本都是围绕着嵌…

【测试】嵌入式软件测试VS一般软件测试

文章目录 1&#xff09;什么是软件测试&#xff1f;测试的目的&#xff1a;软件测试的特点&#xff1a;软件测试信息流&#xff1a;软件测试的对象&#xff1a; 2&#xff09;嵌入式软件测试2.1 嵌入式软件2.2 嵌入式软件测试嵌入式软件测试的特点&#xff1a; 3&#xff09;嵌…

嵌入式软件自动化测试介绍

什么是嵌入式测试 嵌入式软件测试的概念似乎没那么大众&#xff0c;很多人从字面上理解&#xff0c;可能会以为这是个硬件测试&#xff0c;那么嵌入式测试实际上是什么呢&#xff1f; 根据IEEE&#xff08;国际电机工程师协会&#xff09;的定义&#xff0c;嵌入式系统是“控…

嵌入式软件测试的基本方法

嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可剪裁&#xff0c;适应应用系统对功能、可靠性、成本、体积及功耗严格要求的专用计算机系统。嵌入式系统的软硬件功能界限模糊&#xff0c;测试比PC系统软件测试要困难得多&#xff0c;嵌入式软件…

嵌入式测试大赛预选赛

刚刚参加了预选赛&#xff0c;对于这种热身赛&#xff0c;是不需要一点编程能力的&#xff0c;只不过需要一些细心 题目下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Xm2d8UYhrK75fukcXQhEcg 密码&#xff1a;hxzy 这次预选赛是在练习题4的基础上改的&#x…