$\text{Solution}$
很容易就能够想到位置和位置上可能的数相匹配,这样子就是二分图最大匹配的问题。
可是那么简单,最有意思的操作在于匹配要求字典序。
这么一来我们要思考一下二分图匈牙利算法实现的特点。
匈牙利算法存在“反悔”操作,也就是说前面匹配好的如果后面需要的话可能会把当前的顶掉,换句话说,假如之前贪心找到最小的匹配过去,会被后面的给顶掉。
为了保证前面的字典序最小,我们需要倒序匹配 ,即让后面的先匹配,这样的话就可以保证前面的字典序最小,从而保证整体的字典序最小。
说完了匈牙利的事,接下来讲讲加边需要注意的地方。
看得出来这个边肯定不能乱加吧。。。在匈牙利具体匹配的过程中,我们对每一个位置需要优先选择小的数以保证字典序,所以找到合法的数字之后要排个序,如果是 $\text{vector}$ 存边的话直接加进去,前向星链表存边的话要注意遍历边表的时候是倒序遍历的(先加进去的边后被遍历到),所以要将边从大到小加入。
$\text{Code}$
1 |
|