题解:P13097 [FJCPC 2025] 割点
好妙的题目,参考了官方题解才做出来。
题目的关键约束是:点 \(1\) 必须是割点,点 \(n\) 必须不是割点;给定的 01 串规定了内部各点是否为割点;所有顶点度数需满足非增序列。若把“是否为割点”用树论语言描述,可借助圆方树的结论:在一棵树里,叶子一定不是割点,而度数 \(\ge 2\) 的内部结点一定是割点。因此只要把所有非割点做成叶子、所有割点做成内部点,就能同时满足割点判定与度数条件。由此问题转化成:怎样选边,让指定的 \(0\) 变成叶子、指定的 \(1\) 变成内部结点,并保持连通。
首先,内部若没有 \(0\),则所有内部点都要求是割点,无法给点 \(1\) 留下一条叶子边,必无解。若恰有一个 \(0\),但它不在 \(n-1\) 位置,那么在 \(0\) 之后仍出现 \(1\),会导致后面的割点度数 \(\ge 2\) 而编号更大,破坏度数单调,同样无解。其余情况一定可行。
当内部 \(0\) 至少两个时,取最前两个 \(0\),记为 \(p,q\)。连边 \(1-p\)、\(1-q\),再把剩余 \(0\) 按编号依次首尾相接插在 \(p\) 与 \(q\) 之间,形成一条“叶环”,环上全部顶点度数为 \(2\),但因为任意一处断开后环仍连通,故它们都不是割点。对所有内部 \(1\),则按编号升序串成一条链,首端接点 \(1\),尾端接点 \(n\)。链上每个点度数恰为 \(2\),删除即可把整条链分成左右两段,因而是割点。点 \(1\) 现有至少三条边:两条指向 \(p,q\) 和一条指向链,度数最大;点 \(n\) 只有一条来自链,保证不是割点且度数最小。其余内部 \(0\) 由于在环上度数为 \(2\),不影响度序单调。
当唯一内部 \(0\) 位于 \(n-1\) 时,把全部内部 \(1\) 按编号连成链,接在 \(1\) 与 \(n\) 之间,再单独把 \(n-1\) 作为叶子挂到 \(1\) 上即可。此时链上所有 \(1\) 是割点,\(n-1\) 是叶子非割点,点 \(n\) 仍是叶子非割点,度序为 \((d_1,d_2,\dots,d_n)=(k+1,2,\dots,2,1,1)\) 满足非增。
时间复杂度 \(O(n)\)。

浙公网安备 33010602011771号