题目链接——洛谷(精确涉及到了WQS二分)
BZOJ-2654(不推荐)
个人不推荐做BZOJ2654的这道题,因为那道题可以水过去,不用WQS二分也是可以的,可以直接二分答案,显然是没有这个好的。
先在这里讲一下什么是WQS二分吧,也是从网上看来的,一开始在做这道题的时候,想到的也是存在这种可能性,但是依然WA了几次:
先说题意:给你一个N个点M条边无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有K条白色边的生成树。
然后WQS二分:也就是在黑边与白边存在相等的时候,我们直接二分的话,是得不到答案的,这时候就是需要去进行处理了,就有可能去取了“实际价值”更大的白边,而没有去取现实价值更小的黑边;或者现实价值更大的黑边、“实际价值”更小的白边。
举个例子,我们现在对所有白边(先不要管为什么“加一个数”)统一加上一个值,然后,(譬如说是“+(-5)”)出现值变成「1(0),1(0),1(0),1(0),1(1),1(1),1(1)」,但是我们只需要四条边,两条白边即可,我们会很自然的选择前4条边,但是出现了4条白边的情况;再看(现在到了“+(-4)”),出现值变成「2(0),2(0),2(0),2(0),1(1),1(1),1(1)」,此时我们会拿3条黑边和1条白边的形式了。
遇到上面这个形式应该怎么办呢,当“+(-5)”的情况的时候,其实我们就是得到了我们想要的答案了,因为需要两条白边,所以我们4 - (2 * (-5)) = 14就是我们要的答案了。(这就是WQS二分的解决办法QAQ)
其实在这种情况下,我们固定了白边(因为上限是确定的),然后黑边因为等同于此时的“假定”白边,所以,我们实际上做了一个用黑边代替白边的过程。
那么,上面讲到“对所有白边统一加一个数”,这是为什么呢?
可以看到,当对所有白边的边权-INF的时候,能取尽可能多的白边了,同理的,对所有白边的边权+INF的时候,取到的白边就会尽可能的少了,条件是限行的,所以,我们可以这样二分答案去满足条件。
一组测试样例:
6 8 3
0 1 2 1
0 2 10 0
1 3 4 1
1 4 30 0
2 5 4 0
1 2 4 0
3 4 5 1
4 5 5 1
ans:27
My Code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include