1. 题目链接
2. 题目描述##
3. 解题思路##
题目中要求如果一个顶点被选择,那么8个方向上的顶点就不能被选择。显然,这很像二分图的染色问题。
将每个非障碍的顶点与其8个方向上的非障碍顶点连一条边,那么本题就是一个求最大独立集的问题,而且是一个求二分图的最大独立集的问题。
为什么是二分图呢?可以从下面两条性质来分析:
- 对于任意节点$u$,不可能经过奇数步回到节点$u$,实际上,这就是
匈牙利算法 Hungary
的进行二分图的判断的主要思想; - 按照题目中那个图,将所有顶点划分成红色、黄色两类节点,可以发现同色的节点之间没有边。
而二分图上有很好的性质,比如:
- 最大匹配数 = 最小点覆盖;
- 最大独立集 = 最小边覆盖 = 顶点数 $\lvert V \lvert$ - 最大匹配数;
- DAG 的最小路径覆盖数 = DAG 图中的节点数 - 相应二分图中的最大匹配数。
- DAG 的最小路径覆盖是指找最小数目的互相不相交的有向路径,满足 DAG 的所有顶点都被覆盖。
- DAG 对应的二分图这样构造:对于 DAG 中的一个顶点 $p$,二分图中有两个顶点 $p$ 和 $p'$,对应 DAG 中的一条有向边 $p\to q$,二分图中有 $p\to q'$ 的一条无向边。二分图中 $p$ 属于 $S$ 集合,$p'$ 属于 $T$ 集合.
- …
求二分图的最大匹配数的方法有 匈牙利算法(复杂度$\mathcal O(VE)$) 和 网络流(代表算法就是Dinic/Hopcroft-carp 算法,复杂度$\mathcal O(\sqrt{V}E)$)。
4. 参考代码##
1 |
|