2025/12/10 分享

这篇本来是 10 号晚上写完的,但是删删改改总是不满意,感觉问题不具有普适性,要证明的定理不够优雅。
但是今天突然感觉似乎有一个比较优雅的角度可以证,算是偿还了 10 号的债务。

而且今天手上其实还捏着一点东西想写,那就今天归今天,以前归以前好了。

近况。
12 号到 15 号低烧,迷迷糊糊的睡了四天,每天估计就清醒了几个小时。事实上从 11 号开始就已经身体不适了。

也不清楚是不是因为这个定理没找到优雅的表达方式,让我太燥郁,进而导致的身体问题。
还是我本来就因为身体不适导致我写不好这个定理。对,10 号喝了好多冰饮似乎还熬夜了,也有可能确实是那天的问题。

一类二分图最大匹配模型的贪心解决策略。

考虑具有二分划 \(\mathbb{X} = \{a_1, a_2, \cdots, a_n\}\)\(\mathbb{Y} = \{b_1, b_2, \cdots, b_m\}\) 的二分图 \(G = (V, E)\) 。对于任意 \(1 \leq i < j \leq n\)\(a_i\) 连接 \(Y\) 中的一段后缀 \(\{b_k, b_{k + 1}, \cdots, b_{m}\}\)\(a_j\) 连接 \(Y\) 中的一段后缀 \(\{b_l, b_{l + 1}, \cdots, b_{m}\}\) ,且满足 \(1 \leq k \leq l \leq n\) 。询问这个二分图的最大匹配。

我们可以使用 \(O(|V| |E|)\) 的增广路算法或者 \(O(\sqrt{|V|} |E|)\)\(Dinic\) 直接求最大匹配。

但实际上这个匹配模型中存在 \(O(|V|)\) 的贪心匹配算法。

  1. \(ptr_0 = 1\)\(ptr_1 = m\)
  2. \(a_{ptr_0}\)\(b_{ptr_1}\) 连接,则匹配 \(a_{ptr_0}, b_{ptr_1}\) ,并令 \(ptr_0 \gets ptr_0 + 1\)\(ptr_1 \gets ptr_1 - 1\)
  3. \(a_{ptr_0}\)\(b_{ptr_1}\) 不连接,令 \(ptr_0 \gets ptr_0 + 1\)

\(ptr_0 = n + 1\) ,能得到一组最大匹配。

证明
我们考虑 \(a_1\) 可以和 \(b_m\) 匹配的情况下(否则考虑再 \(a_2\) 是否可以和 \(b_m\) 匹配),存在两种可能。
情况一是存在一种最优解满足 \(\forall i, 2 \leq i \leq n\)\(a_i\) 匹配都不必须需要 \(b_m\) ,那么 \(a_1\) 显然和 \(b_m\) 匹配属于这个最优解;
情况二是任意最优解都满足 \(\exists i, 2 \leq i \leq n\)\(a_i\) 的匹配必须要 \(b_m\) 。则 \(b_m\) 要么和 \(a_1\) 匹配,剩余 \(\mathbb{L}_{1} = \{a_2, a_3, \cdots, a_n\}\) 未匹配。要么和 \(a_i\) 匹配,剩余 \(\mathbb{L}_2 = \{a_1, a_2, \cdots, a_{i - 1}, a_{i + 1}, \cdots, a_{n}\}\) 未匹配。在 \(b_m\) 不影响 \(\mathbb{L}_{3} = \{a_2, a_3, \cdots, a_{i - 1}, a_{i + 1}, \cdots, a_{n}\}\) 匹配的情况下, \(\mathbb{L}_{1}\) 多出一个 \(a_i\)\(\mathbb{L}_2\) 多出一个 \(a_1\) ,而 \(a_i\) 的邻居集是 \(a_1\) 的邻居集的超级,则 \(a_i\) 有着严格比 \(a_1\) 更多的匹配机会。于是 \(b_m\) 应该和 \(a_1\) 匹配。那么情况二矛盾。
那么 \(a_1\) 总该和 \(b_m\) 匹配。

于是我们可以归纳,\(a_{ptr_0}\) 应该和 \(b_{ptr_1}\) 匹配。除非 \(a_{ptr_0}\) 没有任何匹配机会,则 \(ptr_0\) 自然而然可以往后一个位置。
\(\square\)

思路总结:如果 \(a_1\) 能和 \(b_m\) 匹配却不去和 \(b_m\) 匹配。若存在一个最优解满足 \(a_2, \cdots, a_n\) 的匹配都不需要 \(b_m\) ,则纯亏。否则总有一个最优解存在 \(a_i\) 匹配 \(b_m\) ,则只需证明 \(a_1\)\(b_m\) 匹配产生的影响严格不会比 \(a_i\)\(b_m\) 产生的影响更坏。

1:
有序列 \(a = \{ a_1, a_2, \cdots, a_n \}\) 。若 \(\exists 1 \leq i < j \leq n, a_i + a_j \leq w\) ,则 \(a_i\)\(a_j\) 可以匹配。询问最大匹配。

则我们首先按从小到大的排序序列 \(\{a\}\) ,则 \(\forall 1 \leq i < j \leq n\)\(a_i\) 匹配一段后缀 \(L_{1}\)\(a_j\) 匹配一段后缀 \(L_{2}\) ,且 \(L_{1} \subset L_{2}\)
于是我们贪心地让首元素和尾元素匹配然后从 \(\{a\}\) 中删除即可。除非首元素没有任何匹配机会,则自然直接删除首元素。

posted @ 2025-12-12 05:09  03Goose  阅读(7)  评论(0)    收藏  举报