题目分析:

不难注意到仙人掌边可以删掉。在森林中考虑树形DP。

题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数。

接着将所有的边接到当前点,然后每两个方案可以任意拼接。然后考虑引一条边上去的情况,选一个点不与周围连边就行了。

判仙人掌利用dfs树与树前缀和即可。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ;
const int mod = ; int T,n,m,arr[maxn],C[maxn],d[maxn],up[maxn],dep[maxn];
int f[maxn],gi[maxn]; struct edge{int u,v,flag;}edges[maxn]; vector <pair<int,int> > g[maxn];
vector <int> nxt[maxn]; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
nxt[i].clear(),g[i].clear(),arr[i] = ,d[i]=,dep[i]=,up[i]=;
f[i] = ;gi[i] = ;
}
for(int i=;i<=m;i++){
scanf("%d%d",&edges[i].u,&edges[i].v);
g[edges[i].u].push_back(make_pair(edges[i].v,i));
g[edges[i].v].push_back(make_pair(edges[i].u,i));
edges[i].flag = ;
}
} void DFST(int now,int dp){
dep[now] = dp;
for(auto it:g[now]){
if(!dep[it.first]) {
up[it.first] = it.second; nxt[now].push_back(it.first);
DFST(it.first,dp+);
}
else if(dep[it.first] < dep[now]) continue;
else d[it.first]++,d[now]--,edges[it.second].flag = ;
}
} void dfsup(int now){for(auto it:nxt[now]) dfsup(it),d[now] += d[it];} int cactus(){
DFST(,); dfsup();
for(int i=;i<=n;i++) if(d[i] > ) return ;
for(int i=;i<=n;i++) if(d[i] == ) edges[up[i]].flag = ;
return ;
} void dfs(int now,int fa){
arr[now] = ;int multi = ,cnt = ;
for(auto it:nxt[now]){
if(it == fa) continue;
cnt++;dfs(it,now);
multi = (1ll*multi*gi[it])%mod;
}
if(!cnt) f[now] = gi[now] = ;
else{
f[now] = (1ll*multi*C[cnt])%mod;
gi[now] = f[now] + ((1ll*multi*C[cnt-])%mod)*cnt%mod;
gi[now] %= mod;
}
} void work(){
if(!cactus()) {puts("");return;}
for(int i=;i<=n;i++) nxt[i].clear();
for(int i=;i<=m;i++)
if(!edges[i].flag){
nxt[edges[i].u].push_back(edges[i].v);
nxt[edges[i].v].push_back(edges[i].u);
}
int ans = ;
for(int i=;i<=n;i++) if(!arr[i]) {dfs(i,); ans = (1ll*ans*f[i])%mod;}
printf("%d\n",ans);
} int main(){
scanf("%d",&T);
C[] = C[] = ;
for(int i=;i<=;i++) C[i] = (C[i-] + (1ll*(i-)*C[i-])%mod)%mod;
while(T--){
read();
work();
}
return ;
}

LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】的更多相关文章

  1. BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)

    首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...

  2. [BZOJ4784][ZJOI2017]仙人掌(树形DP)

    4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 312  Solved: 181[Submit][Status] ...

  3. 【BZOJ-1040】骑士 树形DP + 环套树 + DFS

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3312  Solved: 1269[Submit][Status ...

  4. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

  5. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  6. 浅谈关于树形dp求树的直径问题

    在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...

  7. 树形DP 学习笔记(树形DP、树的直径、树的重心)

    前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...

  8. 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)

    传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi​表示把iii为根的子树加边形成仙人掌的方案数. ...

  9. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. tensorflow-gpu安装的一些注意

    按正确的顺序安装,严格安装特定的版本 1,下载和安装严格版本的cuda和cuDnn,其他版本的不干活.比如要求9.0你就不能装9.1.https://www.tensorflow.org/instal ...

  2. 微软是如何让我再次爱上.Net Core和C#的

    “为什么你还想用ASP.NET,难道你还活在90年代吗?”这正是我的一位老同事在几年前我们即将开始的项目中我提出考虑使用ASP.NET时所说的话.当时我很大程度上认同他的看法,微软已经开发了伟大的开发 ...

  3. H5 65-清除浮动方式一

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. c语言之字符串和格式化输入输出

    字符串和格式化输入输出 #include<stdio.h> #include<string.h> #define DENSITY 62.4 int main(void) { f ...

  5. pdf中内嵌字体问题

    在提交论文pdf到IEEE时总要检查字体是否为内嵌的,查看pdf中所有字体及是否内嵌可查看:http://sinme.blog.sohu.com/120043575.html. 具体做法是: 在pdf ...

  6. fileInput插件上传文件

    一.ftl <form action="" method="post" name="form" id="form" ...

  7. Servlet 使用ServletContext共享数据,读取web.xml配置

    ServletContext对象 session和cookie,对于每一个请求用户来说,都是不同的,因为要保证隐私安全. 而有一些数据,可以让所有用户共享,此时就可以用ServletContext对象 ...

  8. python Drools

    python Drools - 国际版 Binghttps://cn.bing.com/search?q=python+Drools&qs=n&FORM=BESBTB&sp=- ...

  9. 注入技术--LSP劫持注入

    1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...

  10. 开发神器之phpstorm破解与日常使用

    PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. PhpStorm可随时帮助用 ...