ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Topcoder 10773 TheCitiesAndRoadDivOne 题解

2021-07-10 09:02:32  阅读:189  来源: 互联网

标签:连通 顺序 题解 路径 10773 num siz Topcoder ord


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

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

标签:连通,顺序,题解,路径,10773,num,siz,Topcoder,ord
来源: https://www.cnblogs.com/yz-beacon-cwk/p/14993049.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有