HDU 3225 Flowers Placement

题意

求第k小的二分图最大匹配方案。

思路

这个题需要我们活用匈牙利算法了。首先正常地建图,运行一次匈牙利算法,这样初步得到了一种最大匹配样态。

接下来,我们使用DFS,从第一束花开始,从小到大挨个枚举这一位放什么,对于每一次枚举,首先要检查在当前已经有的匹配里面是不是这种花已经被匹配过了,如果是的话要解除这一匹配,接下来我们要把这一位在二分图中的匹配指向被枚举的那种花,如果被枚举的那种花原来是指向当前位置的,我们可以直接继续搜索,因为二分图可以继续有机会保持匹配,否则的话我们要以被枚举的那种花原来的东家为起点,进行一次增广路搜索(即匈牙利算法中的一环),如果没有搜索到增广路,说明这样下去也不可能出现最大匹配,可以剪枝了。

注意,如果增广路搜索失败,要把启动搜索之前的那些临时性修改复原,如果增广路搜索成功,那些修改就可以保留了。在增广路搜索过程中,注意不可以让增广路搜索修改当前DFS深度之前的已经固定了的节点。

当深度到达n时,就可以知道当前是一种合法的最大匹配样态,我们可以给计数器+1,当计数器到达k时,中断DFS过程,纪录回溯路径就是答案了。

这种方法可能有一些难以理解,其实只要把增广路过程给当成一种把当前的图给变成匹配了的图的一种“尝试修复”的过程就好了,如果尝试成功,说明以当前图的形态,还有机会出现最大匹配,如果尝试适失败,说明当前图的形态没有前途,不用再深入考虑了。

代码

 

Leave a Reply

Scroll to top