完全图上的最小生成树

此类问题一般采用某B开头的最小生成树算法,而且并不会显式使用。

CF888G

题意

给定一个 \(n\) 个点的完全图。每个点有一个权值 \(a_i\) ,连接 \(i,j\) 两点之间的边权为 \(a_i\) \(xor\) \(a_j\)

其中 \(1\leq n \leq 10^5\)

解法

求异或最小值,考虑trie树。
发现任意两点间的边权对应trie树上的 \(LCA\)
同时 \(LCA\) 也为其子树中最优连边。
构造出 trie 树,然后大力合并左右节点即可。

Tree MST

题意

给定一棵 \(n\) 个节点的树,现有有一张完全图,两点 \(x,y\) 之间的边长为 \(w[x]+w[y]+dis(x,y)\) ,其中 \(dis\) 表示树上两点的距离。
求完全图的MST。

解法

放到树上了。
若两点之间连边,最优路径一定经过 \(LCA\)
可是这里不再具备上题每个点最多有两个儿子的约束了,怎么办?
\(p_i=dis(i,LCA)+w_i\) ,则过 \(LCA\) 的最优解必然为所有子树的最小 \(p_i\) 间的连边。
进一步的,子树中两个点 \(u,v\) 的边权即为 \(p_u+p_v\)。可知只需将所有子树中最小 \(p_u\) 与其他所有点。
采用点分治,最多会产生 \(O(nlogn)\) 条边,进行克鲁斯卡尔即可。

ZigZag MST

题意

对一张 \(n\) 个点的图做 \(Q\) 次加边操作,每次给定 \(A_i, B_i, C_i\),然后按顺序连边 \((A_i,B_i,C_i),(A_i,B_i+1,C_i+1),(A_i+1,B_i+1,C_i+2)\)等等,求给定图的最小生成树。

解法

鬼畜题。
每次加入的边递增,则 \((A_i,B_i)\) 已经连通了才会考虑 \((A_i,B_i+1,C_i+1)\) 的连边。
既然这样,不妨换一个连边方式。
\((A_i,A_{i+1})\) 之间连一条权值为 \(C+1\) 的边,\((B_i,B_{i+1})\) 之间连一条权值为 \(C+1\) 的边....
然后 \((A_i,B_i)\) 之间连一条权值为 \(C\) 的边。

这样的转化不会使答案变得更劣。
然后用线段树或者什么东西维护连边最小值,最后的边数为 \(O(n+q)\)
跑克鲁斯卡尔即可

口糊题

题意

给定一棵 \(n\) 个节点的树,现有有一张完全图,两点 \(x,y\) 之间的边长为 \(max(w[x],w[y])+dis(x,y)\) ,其中 \(dis\) 表示树上两点的距离。
求完全图的MST。

解法

还没做待填

河童重工

题意

给定两棵 \(n\) 个点的带边权树。
求包含 \(n\) 个点的,\(i\)\(j\) 之间边权为 \(d_1(i,j)+d_2(i,j)\) 的完全图的最小生成树大小。
其中 \(dx(i,j)\) 表示 \(i\)\(j\) 两点在第 \(x\) 棵树上的距离

\(1≤n≤10^5,0≤w≤500\)

解法

还没做待填

posted @ 2022-03-22 10:21  Hencecho  阅读(635)  评论(0编辑  收藏  举报