oi-wiki 上有一段最小生成树的唯一性的内容,是这么写的:
考虑最小生成树的唯一性。如果一条边 不在最小生成树的边集中,并且可以替换与其 权值相同、并且在最小生成树边集 的另一条边。那么,这个最小生成树就是不唯一的。
对于 Kruskal 算法,只要计算为当前权值的边可以放几条,实际放了几条,如果这两个值不一样,那么就说明这几条边与之前的边产生了一个环(这个环中至少有两条当前权值的边,否则根据并查集,这条边是不能放的),即最小生成树不唯一。
寻找权值与当前边相同的边,我们只需要记录头尾指针,用单调队列即可在 O(\alpha(m))(m 为边数)的时间复杂度里优秀解决这个问题(基本与原算法时间相同)。
其中,提到最小生成树不唯一,一定是因为相同边权的边可以互相替换。
那么,为什么不可以出现 a+b=c+d 然后让 c+d 替换掉 a+b 呢?
--
FROM 220.181.102.*