题目分析:

不难注意到仙人掌边可以删掉。在森林中考虑树形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. [C#] LINQ之LookUp

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...

  2. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则

    朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则 [下载本文PDF进行阅读] 本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. ...

  3. JVM加载类冲突,导致Mybatis查数据库返回NULL的一个小问题

    今天碰到个bug,虽然小,但是有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b ...

  4. .NetCore 2.1中的HttpClientFactory最佳实践

    .NET Core 2.1中的HttpClientFactory最佳实践 ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpCl ...

  5. hibernate异常找不到get方法org.hibernate.PropertyNotFoundException: Could not find a getter for did in class com.javakc.hibernate.manytomany.entity.CourseEntity

    属性的get方法没找到,可能是CourseEntity类中对应属性没有get方法,如果有就看CourseEntity.hbm.xml属性名称,应该是写错了不和CourseEntity类中属性名相同,修 ...

  6. Dubbo负载均衡与集群容错机制

    1  Dubbo简介 Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 作为一个轻量级RPC框架,D ...

  7. MySQLl导入导出SQL文件

    window 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql ...

  8. Python之切片操作

    1.列表list中使用 1.range()生成器 就是list取值的一种方式. 生成器range(),用于写列表的范围,如果只写一个数,就表示从0开始,到写入的值-1: l=list(range(10 ...

  9. 使用json读写文件中的数据

    把json的数据写入到文件中 import json with open('data.json','w+') as f: json.dump({"name":"张彪&qu ...

  10. 自签名证书 nginx tomcat

    给Nginx配置一个自签名的SSL证书 - 廖雪峰的官方网站 https://www.liaoxuefeng.com/article/0014189023237367e8d42829de24b6eaf ...