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

article/2025/10/25 14:13:32

二分图Bipartite graph

有没有可能通过数学过程找到你的灵魂伴侣?大概让我们一起探索吧!

假设有两组人注册了约会服务。在他们注册后,会向他们展示另一组人的图像并给出他们的描述。他们被要求选择他们愿意与之匹配的人。

所有信息都被输入计算机,计算机以图形的形式对其进行组织。图中的顶点是人,如果他们都表示愿意与另一个人匹配,那么他们之间就有一条边。

请注意,该图由两组顶点(组1和组2)组成,因此同一组中的顶点之间没有边。在数学上,这被称为二部图,这是一个图,其中顶点可以被分成两个单独的组,这样只有边在这两个组之间,而同一组中的顶点之间没有边。

图论中另一个有趣的概念是图的匹配。这个概念在二部图的各种应用中特别有用。让我们讨论什么是图的匹配,以及我们如何在数学上寻找灵魂伴侣的过程中使用它。

再考虑一下约会者。显然,每个人只能与一个人匹配。根据每组成员的选择,这家约会服务公司想看看他们是否能想出一个方案,让每个人都与他们说他们会满意的人匹配。

就代表成员选择的二部图而言,这意味着我们正在寻找一组边,以便每个顶点只有一条边。从数学上讲,这称为匹配。图的匹配是图中没有两条边共享一个顶点的一组边。也就是说,在匹配中,每个顶点只有一条连接到它的边。

此外,当一个匹配是这样的,如果我们试图向它添加一条边,那么它将不再是一个匹配,那么我们称之为最大匹配。最大匹配是包含最大数量边的匹配。需要注意的是,一个图可以有多个最大匹配。因此,我们在我们的二部图中寻找一个最大匹配,以便以这样一种方式匹配每个人,使他们最终都与他们说他们会满意的人匹配。嗯……让我们试着弄清楚。

A bipartite graph, also called a bigraph, is a set of graph vertices decomposed into two disjoint sets such that no two graph vertices within the same set are adjacent. A bipartite graph is a special case of a k-partite graph with k=2. The illustration above shows some bipartite graphs, with vertices in each graph colored based on to which of the two disjoint sets they belong.

Bipartite graphs are equivalent to two-colorable graphs. All acyclic graphs are bipartite. A cyclic graph is bipartite iff all its cycles are of even length (Skiena 1990, p. 213)

----

Bipartite Graph - If the vertex-set of a graph G can be split into two disjoint sets, V1 and V2 , in such a way that each edge in the graph joins a vertex in V1 to a vertex in V2 , and there are no edges in G that connect two vertices in V1 or two vertices in V2 , then the graph G is called a bipartite graph.

二部图-如果图G的顶点集可以拆分为两个不相交集V1和V2,使得图中的每条边将V1中的一个顶点连接到V2中的一个顶点,并且G中没有连接V1中的两个顶点或V2中的两个顶点的边,则图G称为二部图。

Complete Bipartite Graph - A complete bipartite graph is a bipartite graph in which each vertex in the first set is joined to every single vertex in the second set. The complete bipartite graph is denoted by Kx,y where the graph G contains x vertices in the first set and y vertices in the second set.

完全二部图-完全二部图是一个二部图,其中第一个集中的每个顶点都连接到第二个集中的每个顶点。完整的二部图用Kx,y表示,其中图G在第一个集中包含x个顶点,在第二个集中包含y个顶点。

Hopcroft-Karp算法

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

在前一篇文章中,我们讨论了最大匹配的重要性以及基于Ford-Fulkerson的最大二部匹配方法。基于Ford-Fulkerson算法的时间复杂度为O(V×E)。

Hopcroft-Karp算法是在O(√V x E)时间。在讨论算法之前,让我们先定义几个术语

自由节点或顶点:给定匹配的M,不属于匹配的节点称为自由节点。最初,所有顶点都是自由的(请参见下图的第一个图形)。在第二个图中,u2和v2是自由的。在第三个图中,没有顶点是自由的。

匹配和不匹配边:给定匹配M,属于匹配的边称为匹配边,不属于M(或连接自由节点)的边称为不匹配边。在第一个图中,所有边都是不匹配的。在第二个图中,(u0,v1),(u1,v0)和(u3,v3)是匹配的,其他的不匹配。

交替路径:给定一个匹配的M,交替路径是一条边交替属于匹配和不匹配的路径。所有单条边路径都是交替路径。中间图中交替路径的示例有u0-v1-u2和u2-v1-u0-v2。

扩充路径:给定一个匹配的M,扩充路径是一个从自由顶点开始到自由顶点结束的交替路径。所有以自由顶点开始和结束的单边路径都是扩充路径。在下图中,增强路径以蓝色突出显示。请注意,扩充路径始终有一条额外的匹配边。

Hopcroft-Karp算法基于以下概念。

如果存在扩充路径,则匹配的M不是最大值。另一方面也是如此,即如果不存在增广路径,则匹配是最大的

因此,我们的想法是一个接一个地寻找扩充路径。并将找到的路径添加到当前匹配。

Hopcroft-Karp算法

1) 将最大匹配M初始化为空。

2) 而存在一条增广路径p

从M中删除p的匹配边,并将p的不匹配边添加到M

(当p以自由顶点开始和结束时,M的大小会增加1)

3) 返回M。

源代码(POWER BY TRUFFER):

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public class Bipartite_Graph{private int M { get; set; } = 0;private int N { get; set; } = 0;private List<int>[] adj { get; set; }private int[] pairU { get; set; } = null;private int[] pairV { get; set; } = null;private int[] distance { get; set; } = null;public Bipartite_Graph(int m, int n){this.M = m;this.N = n;adj = new List<int>[M + 1];for (int i = 0; i < N + 1; i++){adj[i] = new List<int>();}pairU = new int[M + 1];pairV = new int[N + 1];distance = new int[M + 1];for (int i = 0; i < M + 1; i++){pairU[i] = 0;}for (int i = 0; i < N + 1; i++){pairV[i] = 0;}}public void AddEdge(int u, int v){adj[u].Add(v);}public int Hopcroft_Karp_Algorithm(){int result = 0;while (BFS()){for (int u = 1; u <= M; u++){if (pairU[u] == 0 && DFS(u)){result++;}}}return result;}private bool BFS(){Queue<int> queue = new Queue<int>();for (int u = 1; u <= M; u++){if (pairU[u] == 0){distance[u] = 0;queue.Enqueue(u);}else{distance[u] = Int32.MaxValue;}}distance[0] = Int32.MaxValue;while (queue.Count != 0){int u = queue.Dequeue();if (distance[u] < distance[0]){foreach (int i in adj[u]){int v = i;if (distance[pairV[v]] == Int32.MaxValue){distance[pairV[v]] = distance[u] + 1;queue.Enqueue(pairV[v]);}}}}return (distance[0] != Int32.MaxValue);}private bool DFS(int u){if (u != 0){foreach (int i in adj[u]){int v = i;if (distance[pairV[v]] == distance[u] + 1){if (DFS(pairV[v]) == true){pairV[v] = u;pairU[u] = v;return true;}}}distance[u] = Int32.MaxValue;return false;}return true;}}public static partial class GraphDrives{public static string Hopcroft_Karp(){Bipartite_Graph g = new Bipartite_Graph(4, 4);g.AddEdge(1, 2);g.AddEdge(1, 3);g.AddEdge(2, 1);g.AddEdge(3, 2);g.AddEdge(4, 2);g.AddEdge(4, 4);return ("Size of maximum matching is " + g.Hopcroft_Karp_Algorithm());}}
}


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

相关文章

[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…

嵌入式软件测试

如何在目标板上实时测试应用程序为什么嵌入式系统测试困难&#xff1f; 在目标板上测试面临的系列问题&#xff1a; 1、如何下载测试到板子上&#xff0c;然后如何收集测试结果 2、如何累积可重复自动执行的测试 3、如何尽可能减少人工工作 4、如何减少内存不够的问题 这…

全国软件测试大赛嵌入式测试步骤及所需工具

文章目录 前言一、所需工具二、测试步骤1.从慕测平台上下载题目2.搭建测试环境3.测试脚本编写怎么编写 总结 前言 全国软件测试大赛嵌入式测试最全步骤及所需的工具 一、所需工具 若需要测试工具请私信我 二、测试步骤 以2019年的省赛题目为例 1.从慕测平台上下载题目 下…

嵌入式软件测试(黑盒测试)-----三年嵌入式软件测试的理解

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