1 条题解

  • 0
    @ 2026-10-2 16:58:31

    染色

    设一条边的两个端点颜色相同时有 ss 种染法,不同时有 dd 种染法。整张图的方案数就是对所有点染色求边权乘积之和。

    本题的数据分成两类:n≤12n\le12 时图可能较密;n>12n>12 时图很稀疏,最大的非树边数量只有约 1010。因此分别处理即可。

    先做一个统一的化简。若同一对点之间有多条重边,因为这些边看到的“端点是否同色”完全相同,所以可以直接合并:新的 ss 是所有 sis_i 的乘积,新的 dd 是所有 did_i 的乘积。之后图可以看成简单图,但每条边仍带有一对权值 (s,d)(s,d)。

    对于 n≤12n\le12,直接枚举点颜色形成的集合划分。具体地,用限制增长序列表示一个集合划分:第一个点属于第 00 类,之后每个点可以放进已有颜色类,也可以新开一个颜色类。若最终用了 rr 个颜色类,那么这些抽象颜色类映射到实际的 kk 种颜色共有k(k−1)⋯(k−r+1)k(k-1)\cdots(k-r+1)种方式。枚举过程中,每给一个新点确定所属颜色类,就可以立即乘上它与此前所有点之间边的 ss 或 dd。这样只枚举 Bell 数(参考https://oi-wiki.org/math/combinatorics/bell)量级的状态,B12=4213597B_{12}=4213597,足够通过所有 n≤12n\le12 的数据。

    下面考虑 n>12n>12 的稀疏数据。

    记当前图的答案为 Z(G)Z(G)。有几种非常有用的局部消元。若一条边满足 s=ds=d,它无论两端是否同色都贡献同一个常数 ss,可以直接把 ss 乘入答案并删掉这条边;若点 vv 的度数为 00,它可以任选一种颜色,因此产生因子 kk,然后删掉 vv;若点 vv 的度数为 11,唯一相邻边权为 (s,d)(s,d)。固定邻点颜色后,vv 与其同色有 11 种颜色选择,异色有 k−1k-1 种,因此产生因子s+(k−1)ds+(k-1)d,然后可以把 vv 删除。

    对度数为 22 的点。设 vv 的两个邻点是 x,yx,y,两条边权分别为 (s1,d1),(s2,d2)(s_1,d_1),(s_2,d_2)。把 vv 的颜色求和后,可以用一条新的 x−yx-y 边完全代替这两条边。若 x,yx,y 同色,新边的同色权为s′=s1s2+(k−1)d1d2s'=s_1s_2+(k-1)d_1d_2;若 x,yx,y 异色,vv 可以等于 xx、等于 yy,或者与两者都不同,因此新边的异色权为d′=s1d2+d1s2+(k−2)d1d2d'=s_1d_2+d_1s_2+(k-2)d_1d_2;如果 x,yx,y 原本已经有边,就再按照重边规则把两条边合并。不断进行上述消元后,若图被分成若干连通块,各连通块完全独立,答案直接相乘。

    于是只剩下所有点度数都至少为 33 的核。设某个连通块有 n′n' 个点、m′m' 条边,圈数为c=m′−n′+1c=m'-n'+1。因为最小度至少为 33,3n′≤2m′=2(n′−1+c)3n'\le2m'=2(n'-1+c),所以n′≤2c−2n'\le2c-2。在本题的大数据中,原图的 c=m−n+1c=m-n+1 最大只有 1010,而前面的消元不会增大 cc,因此最后的核至多只有 1818 个点。

    对这个很小的核使用删除-收缩。任选一条非桥边 e=(u,v)e=(u,v),边权为 (s,d)(s,d)。把边权写成d+(s−d)[cu=cv]d+(s-d)[c_u=c_v],于是有Z(G)=dZ(G−e)+(s−d)Z(G/e)Z(G)=dZ(G-e)+(s-d)Z(G/e),其中 G/eG/e 表示把 u,vu,v 合并为一个点。收缩后出现的重边继续直接合并。选择非桥边有一个好处:删除它会让圈数减少 11;收缩它会让点数减少 11。再配合前面的度数不超过 22 消元,递归规模非常小。数据还保证随机生成,因此实际递归节点数很少。树的情况根本不会进入删除-收缩:不断删叶子就能直接算完。

    复杂度方面,n≤12n\le12 时为 Bell 数量级,最大只到 B12B_{12}。对于大数据,设圈数为 cc,消元后的核只有 O(c)O(c) 个点,删除-收缩的复杂度只指数依赖于 cc;本题 c≤10c\le10。空间复杂度很小。

    • 1

    信息

    ID
    2332
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    (无)
    递交数
    5
    已通过
    1
    上传者