在看这道题之前,我们先来了解一下什么是二分图及与二分图匹配的相关概念及基础知识。
基础知识
故名思义,二分图本质上还是由点和边构成的数据结构,与之不同的是,二分图相当于把一张图分成了两个部分,也就是两个部。部与部之间的点没有边相连,以下的几个图都可以算作二分图:
(图中的箭头无意义,并不代表有向边)
现在来简单说一下匹配和最大匹配(因为只涉及匈牙利算法,所以不讲其他杂七杂八的东西。最小点覆盖什么的以后再讲)
简单来说匹配就是从二分图中选出一些边,这些边没有共同的顶点。这些边组成的边集就叫做这个二分图中的一个边集。下面是一个例子,红色边便是匹配:
最大匹配就是匹配中边数最大的一个匹配。如图为上图的一个最大匹配(注意!最大匹配并不是唯一的)
关于匈牙利算法,还有一个重要的概念,便是增广路。增广路在各种算法中都有很大的作用。这里只讲解一下其最基本的一些概念。
增广路的意义便是选取一个不在任何匹配中的一条边作为起点,再选取一条与它相邻的匹配中的一条边,下下一条边又是一条与下一条边相邻的边的不在匹配中的一条边。连在一起交错进行终点不为匹配中的边便是一条增广路。(相信你已经看懵了,下面便给出流程来)
这是一个二分图的匹配,
从任意一个顶点开始进行增广路后:
(x2,y1)不在匹配中,作为起点。所以整个增广路就为:(x2,y1)-(y1,x1)-(x1,y3)-(y3,x4)-(x4,y2)。
绿色边为不在匹配中的边。现在我们将绿色边转为红色边,红色边转为绿色边: