UVA1151 Buy or Build 题解

题目描述

平面上有 n n n个点,你的任务是让所有 n n n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方。另外还有 q q q个套餐,可以购买,如果你购买了第 i i i个套餐,该套餐中的所有结点将变得相互连通,第 i i i个套餐的花费为 c i ci ci。求最小花费。

解题思路

紫书P358,先求不用套餐时最小生成树要用到哪些边,接着枚举全部套餐组合(可以利用二进制位来枚举),每次枚举后把用的套餐的点都用并查集连起来(注意时对于每个套餐里面的点连起来,多个套餐之间可能不连通,需要之后添加边是他们连通),然后根据刚刚不用套餐时求最小生成树用到的边再来求最小生成树(因为加了套餐只会更优,原来用不到的边现在肯定也用不到),每次比较更新答案即可。

知道思路实现起来虽然代码看上去有点多,但是不难,代码就不放了。这里给几点需要注意的:
1、注意格式,除了最后组数据外,每组数据需要额外输出一空行。
2、样例,从图中可以看出除了套餐外连了三条边,不是两条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值