Topcoder 10773 TheCitiesAndRoadDivOne 题解
观察“最少一条路径,最多两条路径”这个条件,发现图中至多有一个环,否则(有至少两个环)一定可以找一对点,使其间有至少 (3) 条路径。
1---2 1-2-3-4
/ | | | |
3---4 5-6 7-8
(1与4间有3条路径) (1与4间有4条路径)
所以图一定是棵树或者基环树。
树
先考虑树的情况。我们不要太着急上 Matrix Tree Theorem 之类的东西(有人是这样想的,其实本题根本用不到),先想想树是怎样构成的。树不就是在已给局面上一条一条加边加出来的嘛!
假定加边有顺序,那么每次都是从两个连通块里各挑一个点加边,合并两个连通块。
不难发现,只有每个连通块的大小是重要的;合并两个大小为 (siz_1, siz_2) 的连通块,方案数为 (siz1 · siz2) 。
可以大胆把“所有连通块大小的集合”设为状态,枚举其中两个进行转移,直到只剩一个连通块为止。乍一看很吓人,其实就算你不排序,状态数也只有 (2^{num} - 1) 个,更何况你还可以排序,将状态数减少到 (num) 的划分数。
最后由于加边其实是没有顺序的,你还要除以边数的阶乘 ((num - 1) !) 。
基环树
考虑到本题 (n leq 20) ,则 (num leq 20) ,可以直接枚举 环跨越的连通块,然后合并它们,把问题转化回树的问题。
计算构成环本身的方案数有点烦。设跨越 (k) 个连通块,要分三种情况讨论:(k = 1), (k = 2), (k > 2)
(k = 1) 时,连通块 (i) 的方案数为:(frac{siz_i · (siz_i - 1)}{2} - (siz_i - 1)) ,就是所有两端不相等的点对数量,减去距离恰好为 (1) (贴着一条边)的那些。
(k = 2) 时,连通块 (i) 与 (j) 的方案数为:(frac{e · (e - 1)}{2}),其中 (e) 为 (i) 与 (j) 间连一条边的方案数,即 (siz_i · siz_j) 。因为这个问题的实质是选两条不等的边,由于顺序问题还要除以 (2) 。
(k > 2) 时,设连通块集为 (mask), (mask) 里的连通块首尾相连,顺序有 (frac{k!}{2}) 种,连接方式有 (siz_{ord_1} · siz_{ord_2} · siz_{ord_2} · siz_{ord_3} · ... · siz_{ord_k} · siz_{ord_1} = siz_{ord_1}^2 · siz_{ord_2}^2 · ... · siz_{ord_k}^2) (其实和顺序没关系),乘起来就好。
汇总起来,终于解决了这道难题。