01分数规划
01分数规划就是给出(n)个二元组((v_1,w_1),(v_2,w_2),cdots,(v_n,w_n)),选出具有(k)个元素的集合(S),使得(frac{sum_{iin S}v_i}{sum_{iin S}w_i})最大(或者最小)。
求解的基本方法是二分答案。
判断是否存在集合(S),使得(frac{sum_{iin S}v_i}{sum_{iin S}w_i}geq x)
也就是(sum_{iin S}v_i-x*sum_{iin S}w_igeq 0)
即为(sum_{iin S}(v_i-x*w_i)geq 0)
因此,将所有元素按照((v_i-x*w_i))的值从大到小排序,贪心选取前(k)个,判断是否大于等于零,从而判断当前答案是否可行。
每次判断的时间复杂度(O(nlog n)),总的时间复杂度(O(nlog nlog m)),(m)表示二分的范围。
最优比率生成树
无向图中的每一条边(i)都有花费(c_i)和权值(s_i),从中选出边集(S)构成一棵生成树,使得(frac{sum_{iin S}c_i}{sum_{iin S}s_i})最小。
和01分数规划类似,二分答案。
(frac{sum_{iin S}c_i}{sum_{iin S}s_i}leq x)
(sum_{iin S}(c_i-x*s_i)leq 0)
每次将每一条边的边权设为((c_i-x*s_i)),通过(prime)算法求出最小生成树,判断最小生成树的总权值是否小于等于零,从而判断当前答案是否可行。
最优比率环
有向图中每个点有点权(w_i),每条边有边权(s_j),从中选出一个环,集合(S)中的元素为环中每个点权和对应入边边权组成的二元组,使得(frac{sum_{kin S}w_k}{sum_{kin S}s_k})最大。
同样类似于01分数规划,二分答案。
(frac{sum_{kin S}w_k}{sum_{kin S}s_k}geq x)
(sum_{kin S}(w_k-x*s_k)geq 0)
改成小于等于零的形式:
(sum_{kin S}(x*s_k-w_k)leq 0)
这样可以使用SPFA判断是否存在负环,从而判断当前答案是否可行。