Topcoder 10773 TheCitiesAndRoadDivOne 题解

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\) (其实和顺序没关系),乘起来就好。

汇总起来,终于解决了这道难题。

上一篇:Android UI效果实现——Activity滑动退出效果


下一篇:【题解】[HAOI2015]树上染色