LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】
题目分析:
不难注意到仙人掌边可以删掉。在森林中考虑树形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树】的更多相关文章
- BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)
首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...
- [BZOJ4784][ZJOI2017]仙人掌(树形DP)
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 312 Solved: 181[Submit][Status] ...
- 【BZOJ-1040】骑士 树形DP + 环套树 + DFS
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3312 Solved: 1269[Submit][Status ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- 树形DP 学习笔记(树形DP、树的直径、树的重心)
前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...
- 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi表示把iii为根的子树加边形成仙人掌的方案数. ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- 我的2017&2018
最近项目进入验收阶段,所以上班没那么忙碌了,但是怎么说呢,我可能天生是闲不住的主,觉得浑身不自在(我这样的人是不是特别不会享福),此处应该有个笑脸哈. 翻看了博客园好几个大牛写的技术文章,感慨大牛不愧 ...
- 11076: 小P的集合 位运算
考虑当只有一个数出现奇数次的时候,我们可以很轻松的知道,把所有的数异或和即可,因为异或运算有一个非常有意思的性质,a^b^a=b 考虑当有两个数(a,b)出现奇数次的时候,我们异或和得到,num=a^ ...
- NFV论文集(三)综述
一 文章名称:Dependability of the NFV Orchestrator: State of the Art and Research Challenges 发表时间:2018 期刊来 ...
- transfer.sh:通过命令行简单的创建文件分享
简介 通过一个命令,就可以在终端上,将文件加密传输到远程服务器,提供对外文件共享的功能. transfer.sh这是一个我常用的.可以在终端上使用的文件共享服务,可以在某些方面替代sz或者scp命令. ...
- Mysql数据库中索引的概念总结
1.索引的目的是什么 1.快速访问数据表中的特定信息,提高检索速度 2.创建唯一性索引,保证数据库表中每一行数据的唯一性. 3.加速表和表之间的连接 4.使用分组和排序子句进行数据检索时,可以显著减少 ...
- PS电商产品banner设计
- Python之字符串操作
一.字符串特点 内容不可修改 password=' #内容不可修改 二.字符串常用方法 1..strip()方法 去字符串两边的空格和换行符 print(password.strip()) #去掉字符 ...
- 使用PHPExcel导出数据库表结构及内容
导出表结构: mysql> desc user ; +----------+--------------+------+-----+---------------------+--------- ...
- JS 获取链接中的参数
1.获取链接全部参数,以对象的形式返回 //获取url中参数 function GetRequest() { var url = location.search; //获取url中"?&qu ...
- for循环游标