我们给出了2维细胞网格。每个细胞可能包含也可能不包含怪物。
我们获得了一个包含怪物的单元格列表。
在一次攻击中,我们可以杀死所有站成一排或一列的怪物。我们 需要告诉消灭所有怪物所需的最小攻击次数。
约束:
1 ≤ N ≤ 1000
1 ≤ X, Y ≤ 10^9
示例:
输入:
3
0 0
1 0
0 1
输出:
2
如何解决这个问题.. ??
答案 0 :(得分:3)
这可以建模为图形问题。
为每个有怪物的行和列创建一个图形节点。 如果怪物在该行和该列上,则连接节点。
这是一个二分图,你想做最小的顶点覆盖。 König's theorem表明,对于二分图,问题与最大匹配问题是等价的,可以在polinomial时间内解决:
http://en.wikipedia.org/wiki/Maximum_matching#Maximum_matchings_in_bipartite_graphs
答案 1 :(得分:0)
这让我想起了Set Cover Problem:
你有一套U
来存储N
怪物:U = {1, 2, ..., N}
,可能会有S
次攻击。每次攻击都是攻击杀死的怪物的一组索引。在您的示例中,S
为S = { {1}, {2}, {}, {1}, {2} }
。您必须找到C
中联合为S
的最小集合U
。