F - Zebraness Editorial by en_translator
The problem is equivalent to a maximization problem where you can assign either B or W to ? and
- Obtain \(1\) point if \(c_{1,1}\) is
Band \(c_{1,2}\) isW - Obtain \(1\) point if \(c_{1,1}\) is
Wand \(c_{1,2}\) isB - Obtain \(1\) point if \(c_{1,1}\) is
Band \(c_{2,1}\) isW - Obtain \(1\) point if \(c_{1,1}\) is
Wand \(c_{2,1}\) isB - Obtain \(1\) point if \(c_{1,2}\) is
Band \(c_{1,3}\) isW
\(\quad\vdots\)
and so on. Sometimes, problems in such form can be boiled down to a minimum cut of a graph.
(This is so-called “Project Selection Problem”)
First, assume that we can obtain \(2N(N-1)\) points at first, and convert “obtain \(1\) point” to “lose \(1\) point.”
- Lose \(1\) point if \(c_{1,1}\) is
Band \(c_{1,2}\) isB - Lose \(1\) point if \(c_{1,1}\) is
Wand \(c_{1,2}\) isW - Lose \(1\) point if \(c_{1,1}\) is
Band \(c_{2,1}\) isB - Lose \(1\) point if \(c_{1,1}\) is
Wand \(c_{2,1}\) isW - Lose \(1\) point if \(c_{1,2}\) is
Band \(c_{1,3}\) isB
\(\quad\vdots\)
However, this form cannot be boiled down to minimum cut. Observe that the grid forms a bipartite graph, and flip B and W for \(c_{i,j}\) such that \(i + j\) is odd.
- Lose \(1\) point if \(c_{1,1}\) is
Band \(c_{1,2}\) isW - Lose \(1\) point if \(c_{1,1}\) is
Wand \(c_{1,2}\) isB - Lose \(1\) point if \(c_{1,1}\) is
Band \(c_{2,1}\) isW - Lose \(1\) point if \(c_{1,1}\) is
Wand \(c_{2,1}\) isB - Lose \(1\) point if \(c_{1,2}\) is
Wand \(c_{1,3}\) isB
\(\quad\vdots\)
When B or W is given in the input, we can add such condition that
- lose \(INF\) points if \(c_{i, j}\) is
B
with a very large constant \(INF\), so that we can regard it as ?.
Now it can be transformed to min-cut problem. Specifically, follow these steps:
- Add an edge of capacity \(1\) from vertex \((i, j)\) to vertex \((i, j + 1)\)
- Add an edge of capacity \(1\) from vertex \((i, j)\) to vertex \((i + 1, j)\)
- Add an edge of capacity \(1\) from vertex \((i, j)\) to vertex \((i, j - 1)\)
- Add an edge of capacity \(1\) from vertex \((i, j)\) to vertex \((i - 1, j)\)
- If \(c_{i, j}\) is
Bafter flippingBandW, add an edge of capacity \(INF\) from vertex \(S\) to vertex \((i, j)\) - If \(c_{i, j}\) is
Wafter flippingBandW, add an edge of capacity \(INF\) from vertex \((i, j)\) to vertex \(T\) - Find the capacity of minimum cut from \(S\) to \(T\). This is equal to the maximum flow from \(S\) to \(T\).
The time complexity is \(O(N^3)\) if Dinic’s algorithm is used. For implementation, you can use maxflow in AC Library.
posted:
last update: