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) 列“拿走”的那些流以外,其它的流量全都从这条边流过,根据流量守恒,能够保证一行一列剩余数量相等)

原文地址:https://www.cnblogs.com/JiaZP/p/13353308.html