【SHOI2006】仙人掌
题目链接 分析: 无向仙人掌比较简单。 一个仙人掌首先是个连通图。一遍深搜可以筛掉。 根据定义,如果有任意边被不同的简单环经过,它不是仙人掌。 那么我们现在要对边,计数经过它的环。 这里的做法是树上差分。第一遍深搜还要搞出$DFS$树和倍增数组,遇到非树边记录下来。 $Trick\quad vis$数组设三个状态:出边到达$0$点,这条边作为树边,到达的点改成$1$点;到达$1$点,记录成环,自己变成$2$点;到达$2$点,这条成环边已经被记录过,不用管。 用每个点表示它的“到父边”上的计数,就是在每条成环边的端点上$++$,它们的$LCA$上$-=2$,最后再来一遍深搜或者借助$DFN$序由下往上传标记即可。 这样得到的边上的计数不代表实际有多少个简单环经过它。但一旦出现共边的简单环,一定有边上的计数超过$1$。这就够了。 接下来计算“仙人数”。 既然不能破坏连通性,那么不能剪那些不在简单环上的树边。发现去掉任意简单环上的一条边满足条件。于是答案就很显然了。设有$k$个简单环,第$i$个简单环有$s_i$条边,那么$$ans=\prod\limits_{i=1}^{k}(s_i+1)$$ 用$LCA$算$s$值,加上高精度,没了。 实现(100分): #include<iostream> #include<cstdio>