CF547D Mike and Fish

做法 1

将相同 \(x\) 的交替染色,相同 \(y\) 的也交替染色。具体的,为了使得行列不冲突,我们将相同 \(x,y\) 的相邻点两两连边(多出的别管),然后跑二分图染色。

注意到这样不会冲突(因为横竖边交替),且满足每行两种颜色数至多差 \(1\) 条件。

做法 2

对行、列分别建点,如果存在点 \((x,y)\) 就在行 \(x\) 和列 \(y\) 之间连一条。现在我们要给每条边定向,使其能找到一种每个点的出入度差不超过 \(1\) 的方案。

假若所有点的度数都是偶数,那么直接跑欧拉回路即可。但是很显然这样只是极少数的情况。

此时一个思想是建虚边。我们每次可以通过建立一条虚边,消除掉一个 \(x\) 中的奇度点和一个 \(y\) 中的奇度点,但是这样可能会剩下若干 \(x\) 中的偶数点或者 \(y\) 中的偶数点。所以考虑此时建立一些虚点,让剩下的这些点全部朝着虚点连边。

最后对每个连通块跑欧拉回路,按照遍历方向给边定向即可。

做法 3

考虑网络流。

依旧对行、列建点。每次遇到 \((x,y)\) 也仍然在它们之间连边,此时流量上下界为 \([0,1]\),其中 \(1\) 表示染成红色。

源点连向第 \(i\) 行的边,流量上下界为 \([\lfloor\frac{c_i}{2}\rfloor,\lceil\frac{c_i}{2}\rceil]\),其中 \(c_i\) 是第 \(i\) 行的点个数。

\(i\) 列连向汇点的边,流量上下界为 \([\lfloor\frac{d_i}{2}\rfloor,\lceil\frac{d_i}{2}\rceil]\),其中 \(d_i\) 是第 \(i\) 列的点个数。

最后直接跑出一个可行流,就可以得到方案。

posted @ 2025-07-12 11:48  徐子洋  阅读(10)  评论(0)    收藏  举报