Description
给定一个\(n\times m\)网格图,其中有一些点是障碍,有一些点是平原。
现在要求你用若干无重边无自环的不相交简单环覆盖所有平原。有一些点\((i, j)\)如果满足经过的两条边一条是横着的一套是竖着的那么就会获得\(V_{i, j}\)的收益。
求是否有解,如果有解的话输出最大收益。
\(n\le 150\),\(m\le 30\),\(0\le V_{i, j}\le 100\)。
Solution
算是坑了很久的传统艺能题,,,
首先先来一步传统艺能:假设所有收益都能获得,然后问题转化成使笋丝尽可能小,也就变成了如果有一个地方是直的话就会有笋丝。
考虑黑白染色,我们钦点只从黑点往白点连边,这样的话每个黑点要向两个不同的白点(不能走到障碍上)连边。我们要希望所有点都弯着走,我们大可以把所有点全部拆成两个点,一个表示横着走一个表示竖着走,分别向源/汇连容量为1的边,同时他们再往相邻的横着/竖着相邻的点连容量为1的边。
但问题是有些时候有些点肯定只能直着走。那可以用“弯直转换”来表示,具体方法就是把一个点拆出来的横竖点互连容量为1费用为\(V_{i, j}\)的边。
最后关于是否有解的判定……最后的流量就是原网格图中用了的边的数量,对于每个环的边数都等于点数,因此总边数要等于总点数,因此最后的流量要等于平地的总数量才算有解。
Code
1 |
|