独一无二的最小生成树
链接:https://ac.nowcoder.com/acm/contest/1221/H
题意:
众所周知,最小生成树是指使图中所有节点连通且边权和最小时的边权子集。
不过最小生成树太简单了,我们现在来思考一个稍微复杂一点的问题。
现在给定一个nnn个点,mmm条边的图,每条边eie_iei都有一个权值wiw_iwi。定义删除一条边eie_iei的代价为wiw_iwi,并且你可以对这个图执行任意次删边操作。
设这个图的最小生成树权值和为sumsumsum,定义一个图的最小生成树是独一无二的当且仅当这个图的边集中没有除最小生成树外的其他子集能满足权值和为sum且使得所有点连通。一个图刚开始可能没 有 独一无二的最小生成树,现在你可以删除一些边,使得剩下的边的最小生成树大小依然为sumsumsum并且这个图的最小生成树是独一无二的。
现在我们想要知道删除的边的权值和最小是多少?
输入:
第一行输入为nnn和mmm,表示这个图的点数和边数。
接下来mmm行,每行三个值uiu_iui,viv_ivi,wiw_iwi,分别代表每条边的两个端点和边权。
数据:1 <= n <= 2e5 m -1<= n<= 2e5 1 <= wi <= 1e9 1<= u,v <= n
个人思路待补
题解::
最小生成树统计冲突边。考虑问题形式我们可以转换成删掉所有可以代替最小生成树种某条的边的所有边权和。 一个比较笨的做法是树上倍增,我们找出一颗最小生成树,然后枚举每条不在树上的边,判断两端路径上的最大边是 否大于这条边,复杂度是O(mlogn+mlogm)O(mlogn + mlogm)O(mlogn+mlogm)。
比较好的做法就是我们在构造最小生成树的时候直接计算每条可以加进最小生成树的边权和,然后最后减掉最小 生成树的边权和就是答案。复杂度是O(mlogm)O(mlogm)O(mlogm)。
纵使单枪匹马,也要勇闯天涯