http://acm.zju.edu.cn/show_problem.php?pid=2333
这题很汗,那天去图书馆看论文,看到一道类似的题目,原题是这样的
一块如下N*M的电路板,有些坏点,一种修理的方法是用预先备用的
的a条N*1和b条1*M去覆盖这些坏点
求出使用条数最少的方法
。。。。。。。。
。。。。。。。。
。。。。。。。。
。。。。。。。。
。。。。。。。。
这题是NP难的
然后就想把他改为没有a,b限制就好做了,当时没想到可以要求求出具体解,觉得直接套模块会被bs,就算了
后来neal竟然出出来了,相当汗。多了求解的过程就成了一道很好的题目。
转化为行和列的二分图匹配后就是最小顶点覆盖的问题了
最小顶点覆盖数等于最大匹配数
要证明这个结论还是有点麻烦的
1、首先对于一个具体的匹配A-a,不可能同时存在未匹配的点B,b 其中(A,b)
(B,a)都是图的边,因为这样的话可以通过匹配(A,b)和(B,a)得到更大的匹配
2、对于一个具体的匹配
A-a
B-b
如果(A,b)还有边,那么对于B,a就可能同时存在未匹配的点c,C,其中(B,c)
(C,a)都是图的边,因为这样之后可以通过匹配(B,c)、(C,a)、(A,b)得到更大的匹配
将选择点成为着色
于是可以这样求解,
1、对于一端匹配而另一端未匹配的边,将匹配的那个点着色
根据结论1,不可能出现匹配的边两点都着色的情况
2、对于两端点都已匹配的但是这条边并不是匹配边的情况,根据结论2这两个端点中至少有一个端点与他匹配的那个点在步骤1之后还未着色,于是将那个点着色即可
3、步骤1,2后对于匹配的边,如果两个点都还未着色,随便选一个就好了