【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");
    puts("网址:blog.youkuaiyun.com/vmurder/article/details/46828379");
}

题解:

裸最小乘积生成树。

最小乘积生成树定义:

有一张n个点m条边的无向图,每条边有k个权值。
现在要取一个边集M使得其将所有点连通,并使
ki=1(jMjcost(j,vali)) 最小
即个边集的每一种边权的总和的乘积最小。

比如:
k=1时,就是裸最小生成树。
k=2时,就是要使 [边集的权值1的和]*[边集的权值2的和] 最小。

最小乘积生成树的一种求法:

广义上的说法(没必要看,或者看完下面的再来看这个就好)

首先我们可以把每种生成树想成一个k维的点,第i维的坐标即那一维上权值的和。

然后我们可以先求出每一维坐标最小的一棵生成树(裸上最小生成树就好),
然后得到一个k-1维的面,然后我们来求一下离这个面最远的点,然后分治下去……据说期望很快……

二维最小乘积生成树的求法:

给每一棵生成树都定义两个权值X、Y,其中X为其包含的所有边的权值x的和,Y为其包含的所有边的权值y的和,那么我们可以把每一种生成树看成一个坐标。

我们先求出坐标x最小的一棵生成树,再求出坐标y最小的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值