一、题目

设平面上分布着n个白点和n个黑点,每个点用一对坐标(x, y)表示。一个黑点b=(xb,yb)支配一个白点w=(xw, yw)当且仅当xb>=xw和yb>=yw。

若黑点b支配白点w,则黑点b和白点w可匹配(可形成一个匹配对)。

在一个黑点最多只能与一个白点匹配,一个白点最多只能与一个黑点匹配的前提下,求n个白点和n个黑点的最大匹配对数。

 

二、解题思路

  一看完题目,一开始的思路是先将黑白点分别存入两个数组中,再对两个数组分别进行对x和对y的排序,在实际实验过程中,发现排序完后数组的下标与点不好对应,这样就不容易确定一个点是否已经匹配过。

  经过了解查阅后发现了最大匹配问题的算法,和本题类似,而且递归的操作复杂度远小于多次对数组的排序。

  而且过多的排序也造成了算法思路难以理清。决定先学习掌握最大匹配度算法再考虑本题…

  在查阅了最大匹配度问题的思想后,发现这是一种递归形式的方法,算法需要基于对二分图的遍历算法,这就需要学习DFS或者BFS,所以又去复习了一下这两个算法,在彻底掌握了之后终于可以步入正题了…

(dfs和bfs的执行动态图

upload/201909241619335734.gif

upload/201909241619330338.gif

 

理解了最大匹配算法后,发现只要在图遍历的基础上,多借助一个matching数组,用来储存各匹配点之间的联系,通过一些剪枝和判断就可以实现。

我选择了DFS进行最大匹配算法的基础算法,DFS是对图做出处理,在空间上需要借助一张邻接矩阵,我的想法是将黑白点问题化作图,再根据题目的要求做出对应的邻接矩阵,这样再通过最大匹配就可以求解出来。

 

下面主要针对这两个问题讨论并通过具体例子演示最大匹配核心思想。

1、如何将黑白点化作图:

创建一个结构体

 

黑白点都看作顶点,只通过color进行区别

2、如何求对应邻接矩阵:

       对储存所有顶点的结构体数组做两次循环,若满足题目中黑点xy坐标大于白点,即将邻接矩阵该位置置为1。

3、具体流程演示:

 

上图分析:

通过邻接表可以知道,2能控制4,7,8三点

一开始2就控制了4,跳过2点

接着5控制了7,跳过5点

6控制了7,但是7已经被5控制,这时回到5,

5控制了8,跳过5

这时7没人控制,6控制7,流程结束,匹配度为3。

 

三、代码(DFS BFS两种实现方法)

复制代码
  1 public class MaxMatching {// 基于DFS  2   3     static int graph[][]; // 邻接表 默认全为0  4     static int n; // 节点数  5     static