UVA1104 芯片难题 Chips Challenge

题目链接

题意

网格上放点,有些强制放,有些不能放,有些可以放可以不放。要求:

  1. \(i\) 行的点数 = 第 \(i\) 列的点数

  2. 每一行每一列的点数不超过总点数的 \(k\) 倍(\(k\) 已知,且不大于1)

\(n <= 40\)

题解

最小割好题。

那么多行行列列肯定要将行列看作点,然后将各自看作边。首先第二个要求可以直接枚举,主要是第一个要求。

根据常见套路,我们可以先把所有点都放上,然后再拿走一些点。这样,放上的点有两种选择:留着或被拿走。因此我们连两种边:如果 \((i, j)\) 这个格子可以被拿走,那么 \(r[i] -> c[j]\),流1费1,表示“拿走”这条途径;对于 \(i <= n\)\(r[i] -> c[i]\),流 \(tot * k\) 费0, 表示一行和一列剩余数量必须相等(如果满流,则除了从 \(i\) 行和 \(i\) 列“拿走”的那些流以外,其它的流量全都从这条边流过,根据流量守恒,能够保证一行一列剩余数量相等)

posted @ 2020-07-21 09:50  JiaZP  阅读(160)  评论(0编辑  收藏  举报