链接:
#include <stdio.h>
int main()
{
puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");
puts("网址:blog.youkuaiyun.com/vmurder/article/details/46828379");
}
题解:
裸最小乘积生成树。
最小乘积生成树定义:
有一张n个点m条边的无向图,每条边有k个权值。
现在要取一个边集M使得其将所有点连通,并使
∏ki=1(∑j∈Mjcost(j,vali)) 最小
即个边集的每一种边权的总和的乘积最小。
比如:
k=1时,就是裸最小生成树。
k=2时,就是要使 [边集的权值1的和]*[边集的权值2的和] 最小。
最小乘积生成树的一种求法:
广义上的说法(没必要看,或者看完下面的再来看这个就好)
首先我们可以把每种生成树想成一个k维的点,第i维的坐标即那一维上权值的和。
然后我们可以先求出每一维坐标最小的一棵生成树(裸上最小生成树就好),
然后得到一个k-1维的面,然后我们来求一下离这个面最远的点,然后分治下去……据说期望很快……
二维最小乘积生成树的求法:
给每一棵生成树都定义两个权值X、Y,其中X为其包含的所有边的权值x的和,Y为其包含的所有边的权值y的和,那么我们可以把每一种生成树看成一个坐标。
我们先求出坐标x最小的一棵生成树,再求出坐标y最小的