若无特殊说明,下文的“图”均指边带权的无向完全图。对于图 G 以及 G 的两个顶点 u,v,记 G(u,v) 表示 (u,v) 这条边的边权。
一个简单一些的问题
本文将基于这个问题的优秀解法进行优化。
给定一棵 n 个点的树,点 u 有权值 f_u,g_u(f_u,g_u \le O(n))。构造图 G,若 u 为 v 的祖先则 G(u,v)=f_u+g_v,若 u,v 不呈祖先后代关系则 G(u,v)=+\infty。求这张图的最小生成树。
时间复杂度要求:O(n\alpha(n))。
为方便叙述,我们不妨设所有 f,g 互不相同。
解法:指定 1 号点为根,设点 u 的父亲是 p_u。对于每个不是根的点 u,我们求出 u 的祖先(包含自身)中 f 最小的点 F_u,求出 u 的子树(包含自身)中 g 最小的点 G_u。取边 (u,F_{p_u}),(p_u,G_u),(F_{p_u},G_u)。我们声称,只需要把上述取出的 3n 条边拿出来跑 Kruskal 就能拿到原图的最小生成树。
对于一个不是根的点 u,考虑 G_u \ne u 的情况。此时,对于所有不等于 F_{p_u} 的 u 的祖先(不包括 u 自身)v,可以使用 u\to F_{p_u}\to G_u\to v 这条路径和前文的结论推导出 (u,v) 这条边不属于最小生成树。
同样的,如果 F_{p_u}\ne {p_u},则对于 u 子树内所有不等于 G_u 的点 v 都有 (p_u,v) 不属于最小生成树。
现在考虑两个点 (u,v) 满足 u 是 v 的祖先,且 F_u=u,G_v=v。设 x 是 u 到 v 路径上第一个满足 F_x\ne u 的点;设 y 是 v 到 u 路径上第一个满足 G_y\ne v 的点。那么,路径上没有点 z 满足 F_z=u,G_z=v 当且仅当 x,y 均存在且 x 是 y 的祖先。此时有 f_x<f_u 且 y 子树中存在点 w 满足 g_w<g_v。考虑 u\to w\to x\to v 这条路径即可证明边 (u,v) 不在最小生成树上。