BZOJ 2654 tree
Description
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。
Input
第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行
每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
Output
一行表示所求生成树的边权和。
Sample Input
2 2 1
0 1 1 1
0 1 2 0
Sample Output
2
HINT
数据规模和约定
0:V<=10
1,2,3:V<=15
0,..,19:V<=50000,E<=100000
所有数据边权为[1,100]中的正整数。
思路:
巧妙,
我们发现,如果考虑权值,那么就没有办法处理黑白,如果考虑黑白,那么又做不到权值的最优。
所以我们冥思苦想如何把黑白区分开,又不能改变权值之间的优劣。于是就有了一个神奇的解法,如果我们给白边增加权值,那么求最小生成树时,由于白边权值增大,所有不容易选白边。
这样一来,我们既没有改变他们权值的顺序,而且白边选的就会少一点,最小生成树有保证了当前状态下的最优解。
记f(x)为给白边增加x权值,求出最小生成树后,白边的数量,又可以发现,f(x)随x增大而减小,所以二分x的值。