最优方案一定包含所有收益为正的预案:加入一条正收益边不会破坏连通性,且严格增加总收益。
因此先把所有 w>0 的边全部选上,并用并查集把它们连起来。若此时已经连通,答案即为正边权和。
否则只需在 w≤0 的边里,用尽量小的损失把剩余连通块连起来:把非正边按权值从大到小排序(0,−1,−2,…),再做 Kruskal,只在连接不同连通块时选用该边并把权值加入答案。
这等价于“先全取正边,再在非正边上取最大权生成森林使整体连通”。
要把 n 个机房用光缆连成一个连通网络。现有 m 条铺设预案,第 i 条连接机房 ui 与 vi,收益为 wi(正数表示盈利,负数表示亏损,也可以为 0)。
可以从预案中挑选任意若干条(条数不限,至少使网络连通),求最大总收益。保证全部预案已经能使 n 个机房互相可达。
机房数不超过 105,预案数满足 n−1≤m≤106,∣wi∣ 不超过 109。
第一行包含两个整数 n 和 m,分别表示机房数量与预案数量,满足 1≤n≤105,n−1≤m≤106。 接下来 m 行,每行三个整数 ui、vi、wi,表示一条连接 ui 与 vi 的预案及其收益,满足 1≤ui,vi≤n,$u_i
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.