题目描述
平面上有 n n n个点,你的任务是让所有 n n n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方。另外还有 q q q个套餐,可以购买,如果你购买了第 i i i个套餐,该套餐中的所有结点将变得相互连通,第 i i i个套餐的花费为 c i ci ci。求最小花费。
解题思路
紫书P358,先求不用套餐时最小生成树要用到哪些边,接着枚举全部套餐组合(可以利用二进制位来枚举),每次枚举后把用的套餐的点都用并查集连起来(注意时对于每个套餐里面的点连起来,多个套餐之间可能不连通,需要之后添加边是他们连通),然后根据刚刚不用套餐时求最小生成树用到的边再来求最小生成树(因为加了套餐只会更优,原来用不到的边现在肯定也用不到),每次比较更新答案即可。
知道思路实现起来虽然代码看上去有点多,但是不难,代码就不放了。这里给几点需要注意的:
1、注意格式,除了最后组数据外,每组数据需要额外输出一空行。
2、样例,从图中可以看出除了套餐外连了三条边,不是两条。