分析:
关键性质:每条边至多属于一个简单环→→→这是一个仙人掌图(CactusGraphCactus GraphCactusGraph)。
生成树计数:对于仙人掌图,每个简单环长为kkk,则生成树数为所有环长的乘积。
原因:每个环必须恰好删去一条边(kkk种选择),不同环的选择相互独立。
算法:用 Tarjan 找双连通分量(每个环是一个biconnectedcomponentbiconnected componentbiconnectedcomponent),或用DFSDFSDFS检测环。对每个环统计边数kkk,答案为∏k mod 998244353\prod k \bmod 998244353∏kmod998244353。
复杂度:O(n+m)O(n + m)O(n+m)。
代码:
实际上,更简单的方法是:仙人掌图中m−n+1=环的数量m - n + 1 = 环的数量m−n+1=环的数量,每个环独立贡献其长度。
更简单的方法(代码):
验证:
样例1:两个环(三角形1 − 2 − 3 − 11\!-\!2\!-\!3\!-\!11−2−3−1长度3,四边形4 − 5 − 6 − 7 − 44\!-\!5\!-\!6\!-\!7\!-\!44−5−6−7−4长度4),3×4=12✓3 \times 4 = 12 ✓3×4=12✓
样例2:无环,生成树唯一,答案1✓1 ✓1✓
注意:题目保证连通,从顶点 1 开始TarjanTarjanTarjan即可。每条边至多属于一个环保证了每个双连通分量要么是单边、要么是简单环,因此弹出边数>1>1>1时即为环长