UVA1104 芯片难题 Chips Challenge
题意
网格上放点,有些强制放,有些不能放,有些可以放可以不放。要求:
-
第 \(i\) 行的点数 = 第 \(i\) 列的点数
-
每一行每一列的点数不超过总点数的 \(k\) 倍(\(k\) 已知,且不大于1)
\(n <= 40\)
题解
最小割好题。
那么多行行列列肯定要将行列看作点,然后将各自看作边。首先第二个要求可以直接枚举,主要是第一个要求。
根据常见套路,我们可以先把所有点都放上,然后再拿走一些点。这样,放上的点有两种选择:留着或被拿走。因此我们连两种边:如果 \((i, j)\) 这个格子可以被拿走,那么 \(r[i] -> c[j]\),流1费1,表示“拿走”这条途径;对于 \(i <= n\) ,\(r[i] -> c[i]\),流 \(tot * k\) 费0, 表示一行和一列剩余数量必须相等(如果满流,则除了从 \(i\) 行和 \(i\) 列“拿走”的那些流以外,其它的流量全都从这条边流过,根据流量守恒,能够保证一行一列剩余数量相等)