bzoj4784【zjoi2017】仙人掌
题目描述

输入格式
输出格式
题解:
- 由于环上的边无法再被另外的环覆盖,所以把所有的环拆掉得到森林;
- 计算每颗树的$ans$乘起来;
- $f[u]$表示以$u$为根的子树的方案,$g[u]$表示以$u$为根的子树并且还有某个点可以向上连边的方案;
- 由于根也可以向上连,$g[u]$是包含$f[u]$的;
- $f[u]$的递推可以将所有的儿子$v$的$g[v]$乘起来,在乘以儿子之间的互相连边或和$u$连边的方案数;
- $h[i]$表示$i$个儿子时互相连边的方案:
- $h[i] = h[i-1] + h[i-2]*(i-1)$;
- $tot$表示$u$的儿子的个数:
- $f[u] = \Pi_{v}g[v] * h[tot]$;
- $u$的子树向上连边可以由$u$或者$u$的一个儿子$v$的子树向上连边;
- $g[u] = f[u] + tot * \Pi_{v}g[v] h[tot-1] = \Pi_{v}g[v]*h[tot+1]$;
- 我一直在纠结不连边的方案去哪了?其实不连边的方案数在统计$v$向上连到$u$时被统计了;
#include<bits/stdc++.h>
using namespace std;
const int N=,mod=;
char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=;char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
int T,n,m,vis[N],bl[N],dfn[N],low[N],idx,fg,ans,st[N],top,o,hd[N],cnt,f[N],g[N],h[N],d[N];
struct Edge{int v,nt;}E[N<<];
inline void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;
}
void tarjan(int u,int fa){
if(fg)return;
dfn[st[++top]=u]=low[u]=++idx;
int tot=;
for(int i=hd[u],v;i;i=E[i].nt){
v=E[i].v;
if(v==fa)continue;
if(dfn[v=E[i].v]){
if(d[v])continue;
if(dfn[v]<dfn[u]&&tot++){fg=;break;}
low[u]=min(low[u],dfn[v]);
}else{
tarjan(v,u);
if(low[v]<dfn[u]&&tot++){fg=;break;}
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
int v;++cnt;
do{bl[v=st[top--]]=cnt;d[v]=;}while(v!=u);
}
}
void dfs(int u){
f[u]=g[u]=vis[u]=;
int tot=;
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(vis[v]||bl[v]==bl[u])continue;
tot++;
dfs(v);
f[u]=1ll*f[u]*g[v]%mod;
g[u]=1ll*g[u]*g[v]%mod;
}
f[u]=1ll*f[u]*h[tot]%mod;
g[u]=1ll*g[u]*h[tot+]%mod;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("T1.in","r",stdin);
freopen("T1.out","w",stdout);
#endif
T=rd();
h[]=h[]=;
for(int i=;i<=;++i)h[i]=(h[i-]+1ll*(i-)*h[i-]%mod)%mod;
while(T--){
n=rd();m=rd();
fg=idx=cnt=top=;ans=o=;
for(int i=;i<=n;++i)vis[i]=hd[i]=dfn[i]=d[i]=low[i]=;
for(int i=;i<=m;++i)adde(rd(),rd());
tarjan(,);
if(fg){puts("");continue;}
for(int i=;i<=n;++i)if(!vis[i]){
dfs(i);
ans = 1ll * ans * f[i]%mod;
}
printf("%d\n",ans);
}
return ;
}bzoj4784
bzoj4784【zjoi2017】仙人掌的更多相关文章
- [BZOJ4784][ZJOI2017]仙人掌(树形DP)
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 312 Solved: 181[Submit][Status] ...
- BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)
首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...
- bzoj4784 [Zjoi2017]仙人掌
Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得 ...
- 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi表示把iii为根的子树加边形成仙人掌的方案数. ...
- 【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)
[BZOJ4784][ZJOI2017]仙人掌(Tarjan,动态规划) 题面 BZOJ 洛谷 题解 显然如果原图不是仙人掌就无解. 如果原图是仙人掌,显然就是把环上的边给去掉,变成若干森林连边成为仙 ...
- ●洛谷P3687 [ZJOI2017]仙人掌
题链: https://www.luogu.org/problemnew/show/P3687题解: 计数DP,树形DP. (首先对于这个图来说,如果初始就不是仙人掌,那么就直接输出0) 然后由于本来 ...
- 【做题】ZJOI2017仙人掌——组合计数
原文链接 https://www.cnblogs.com/cly-none/p/ZJOI2017cactus.html 给出一个\(n\)个点\(m\)条边的无向连通图,求有多少种加边方案,使得加完后 ...
- LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】
题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...
- zjoi2017 仙人掌
题解: 好难的dp啊...看题解看了好久才看懂 http://blog.csdn.net/akak__ii/article/details/65935711 如果一开始的图就不是仙人掌,答案显然为0, ...
- 【题解】ZJOI2017仙人掌
感觉这题很厉害啊,虽然想了一天多但还是失败了……(:д:) 这题首先注意到给定图中如果存在环其实对于答案是没有影响的.然后关键之处就在于两个 \(dp\) 数组,其中 \(f[u]\) 表示以 \(u ...
随机推荐
- Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- Scrum Meeting 3 -2014.11.5
这几天小伙伴们都在努力,研究出不少改进方案并加以设计和实施了,分词算法的优化进度可观,而其他的任务在改进的过程中产生了些问题,对于之前代码的设计感到疑惑,我们找到了上届的学长们咨询,他们也给出了不少建 ...
- Daily Scrum (2015/10/30)
据组员们反映其他组都会有休息时间,所以我和PM讨论把每周5晚上作为日常休息时间,这一天组员们自由阅读.
- WebGL学习笔记(二)
目录 绘制多个顶点 使用缓冲区对象 类型化数组 使用drawArrays()函数绘制图形 图形的移动 图形的旋转 图形的缩放 绘制多个顶点 使用缓冲区对象 创建缓冲区对象 var vertexBuff ...
- 微服务架构之思维三部曲:What、Why、How
本文转自:http://www.servicemesh.cn/?/article/49 What:什么是微服务? 某百科对微服务架构的定义和阐述:微服务可以在“自己的程序”中运行,并通过“轻量级设备与 ...
- 微信小程序入门一: 简易form、本地存储
实例内容 登陆界面 处理登陆表单数据 处理登陆表单数据(异步) 清除本地数据 实例一: 登陆界面 在app.json中添加登陆页面pages/login/login,并设置为入口. 保存后,自动生成相 ...
- scrapy学习笔记(三):使用item与pipeline保存数据
scrapy下使用item才是正经方法.在item中定义需要保存的内容,然后在pipeline处理item,爬虫流程就成了这样: 抓取 --> 按item规则收集需要数据 -->使用pip ...
- PHP学习心得1
php是动态网站开发的优秀语言,在学习的时候万万不能冒进.在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理,这样你很难利用 ...
- MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- object & over-write
object & over-write