加载中...

树上拓扑序计数

A

用栈对 \(01\) 序列模拟后,得到若干棵树构成的有向图(与普通的有向树相比,边是逆序的),答案即为这个森林的拓扑序个数(对于每棵树均是独立的,可以任意排布顺序)。将每棵树的根都连向一个超级源点,就将森林整合成了一棵树。则问题等价于求这棵树的拓扑序个数。

有两种做法:

  1. 公式法:设一棵有向树的大小为 \(n\),根为 \(root\),则:

\[ans = \frac{siz[root]!}{\prod_{u=1}^{n}siz[u]} \]

可以利用下面的递推式作进一步简化得到。
2. 令 \(f[u]:\)\(u\) 为终点,拓扑序个数。则递推式为:

\[f[v] = (\prod_{v->u} f[u]) * \frac{(siz[u]-1)!}{siz[v]!} \]

简略证明:在以 \(u\) 为终点的有向树形成的拓扑序中,\(u\) 一定在最后一个位置,则相当于求前 \(siz[u] - 1\) 个点形成的拓扑序个数,其中每个 \(v\) 部分存在拓扑序的约束关系,不同 \(v\) 的部分两两独立,互不影响,可随意排布。则可以先求所有点的全排列个数,再除以每一个 \(v\) 部分的全排列个数,最后再乘上每一部分的拓扑序约束关系,即为整棵树的拓扑序个数。

(注意有向树边的正向反向的拓扑序个数是相同的)

code1 递推
code2 公式

posted @ 2025-04-27 20:02  jxs123  阅读(329)  评论(0)    收藏  举报