题目分析:

不难注意到仙人掌边可以删掉。在森林中考虑树形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#跨进程读取listview控件中的数据

    http://www.cnblogs.com/Charltsing/p/slv32.html 欢迎交流:QQ564955427 读取标准的32位listview控件中的数据,网上已经有很多代码了.今天 ...

  2. Python_阻塞IO、非阻塞IO、IO多路复用

    0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...

  3. stark组件之展示数据(查)

      1.编辑按钮构建完成 2.构造表头,删除,checkbox,links编辑 3.代码+总结   1.编辑按钮构建完成 1.必备知识预习 第一个会打印5. 第二个输出alex alex是person ...

  4. MyBatis使用注解开发

  5. 【Python3练习题 025】 一个数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同

    [Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同 x = input('请输入任意位数的数字:') if x == x[::-1]: ...

  6. yolo buffer is too small for requested array

    yolo.cfg 与 yolo.weights 版本一定要对应, darknet链接 https://github.com/pjreddie/darknet 下载后在cfg文件夹下找到yolov2的配 ...

  7. java面试题2019

    面向对象的特征有哪些方面? 原来学的时候说是三种特征,即封装.继承和多态. 现在一般说面向对象有四大特性,即抽象.封装.继承和多态. 1.抽象:将同类对象的共同特征提取出来构造类. 2.封装:将数据隐 ...

  8. Spring中RedirectAttributes的用法

    RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类.他有两种带参的方式: 第一种: redirectAttribut ...

  9. npm的nrm命令使用--设置镜像地址

    npm下载会很慢,因为npm默认从国外下载资源,建议修改npm镜像源地址 1.运行npm i nrm -g全局安装nrm包: 2.使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址 ...

  10. sqlyog Can't connect to MySQL server on localhost (0)

    https://blog.csdn.net/l1336037686/article/details/78940223