树的拓扑序计数

news/2024/9/18 3:49:39/文章来源:https://www.cnblogs.com/cmyg/p/18409358

 

树的拓扑序计数:树走拓扑排序,从根节点出发,每次只能从已遍历的点延伸到下一个相邻点,把树的节点都遍历完,所有遍历方式的情况数目?

 

对于一棵子树,它里面有k个点,可以有k!操作情况,但要确保根节点先走,剩下随意,可以有(k-1)!操作情况(根节点先走,就确定了一个位置,剩余k-1个位置),相当于/k。

对于当前树的所有节点和其子树,都是这样,/siz(tree_i)

结果为 n! / siz(tree_i)

 

F - Distributing Integers (atcoder.jp)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 
 6 const LL mod=1e9+7;
 7 
 8 const double eps_1=1e-5;
 9 const double eps_2=1e-10;
10 
11 const int maxn=2e5+10;
12 
13 vector<LL> adj[maxn];
14 LL n,siz[maxn],cheng[maxn],ni[maxn],result[maxn]; //,ni_cheng[maxn]
15 bool vis[maxn];
16 
17 void dfs(LL d)
18 {
19     siz[d]++;
20     vis[d]=1;
21     for (LL child:adj[d])
22         if (!vis[child])
23         {
24             dfs(child);
25             siz[d]+=siz[child];
26         }
27     (result[1] *= ni[siz[d]]) %= mod;
28 }
29 
30 LL mul(LL a, LL b)
31 {
32     LL ans=1;
33     while (b)
34     {
35         if (b&1)
36             ans=ans*a%mod;
37         a=a*a%mod;
38         b>>=1;
39     }
40     return ans;
41 }
42 
43 void modify(LL d)
44 {
45     vis[d]=1;
46     for (LL child:adj[d])
47         if (!vis[child])
48         {
49             result[child] = result[d] * siz[child] %mod * ni[n-siz[child]] %mod;
50             modify(child);
51         }
52 }
53 
54 int main()
55 {
56     LL u,v,i;
57     cin>>n;
58     cheng[0]=1;
59     for (i=1;i<=n;i++)
60         cheng[i]=cheng[i-1]*i%mod;
61     /*
62     ni_cheng[n]=mul(cheng[n],mod-2);
63     for (i=n-1;i>=0;i--)
64         ni_cheng[i]=ni_cheng[i+1]*(i+1)%mod;
65     ni[0]=1;
66     for (i=1;i<=n;i++)
67         ni[i]=cheng[i-1]*ni_cheng[i]%mod;
68     */
69     
70     ni[0]=1;
71     for (i=1;i<=n;i++)
72         ni[i] = mul(i, mod-2);
73         
74     for (i=1;i<n;i++)
75     {
76         cin>>u>>v;
77         adj[u].push_back(v);
78         adj[v].push_back(u);
79     }
80 
81     memset(vis,0,sizeof(vis));
82     memset(siz,0,sizeof(siz));
83     result[1]=cheng[n];
84     dfs(1);
85 
86     memset(vis,0,sizeof(vis));
87     modify(1);
88 
89     for (i=1;i<=n;i++)
90         cout<<result[i]<<endl;
91 
92 
93     return 0;
94 }

 

这样写可以减少求逆元的操作数:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 
 6 const LL mod=1e9+7;
 7 
 8 const double eps_1=1e-5;
 9 const double eps_2=1e-10;
10 
11 const int maxn=2e5+10;
12 
13 vector<LL> adj[maxn];
14 LL n,siz[maxn],cheng[maxn],ni[maxn],result[maxn]; //,ni_cheng[maxn]
15 LL ni_cheng[maxn];
16 bool vis[maxn];
17 
18 void dfs(LL d)
19 {
20     siz[d]++;
21     vis[d]=1;
22     for (LL child:adj[d])
23         if (!vis[child])
24         {
25             dfs(child);
26             siz[d]+=siz[child];
27         }
28     (result[1] *= ni[siz[d]]) %= mod;
29 }
30 
31 LL mul(LL a, LL b)
32 {
33     LL ans=1;
34     while (b)
35     {
36         if (b&1)
37             ans=ans*a%mod;
38         a=a*a%mod;
39         b>>=1;
40     }
41     return ans;
42 }
43 
44 void modify(LL d)
45 {
46     vis[d]=1;
47     for (LL child:adj[d])
48         if (!vis[child])
49         {
50             result[child] = result[d] * siz[child] %mod * ni[n-siz[child]] %mod;
51             modify(child);
52         }
53 }
54 
55 int main()
56 {
57     LL u,v,i;
58     cin>>n;
59     cheng[0]=1;
60     for (i=1;i<=n;i++)
61         cheng[i]=cheng[i-1]*i%mod;
62     
63     ni_cheng[n]=mul(cheng[n],mod-2);
64     for (i=n-1;i>=0;i--)
65         ni_cheng[i]=ni_cheng[i+1]*(i+1)%mod;
66     ni[0]=1;
67     for (i=1;i<=n;i++)
68         ni[i]=cheng[i-1]*ni_cheng[i]%mod;
69     
70     
71     /*
72     ni[0]=1;
73     for (i=1;i<=n;i++)
74         ni[i] = mul(i, mod-2);
75     */
76         
77     for (i=1;i<n;i++)
78     {
79         cin>>u>>v;
80         adj[u].push_back(v);
81         adj[v].push_back(u);
82     }
83 
84     memset(vis,0,sizeof(vis));
85     memset(siz,0,sizeof(siz));
86     result[1]=cheng[n];
87     dfs(1);
88 
89     memset(vis,0,sizeof(vis));
90     modify(1);
91 
92     for (i=1;i<=n;i++)
93         cout<<result[i]<<endl;
94 
95 
96     return 0;
97 }

 

C-序列_牛客挑战赛76 (nowcoder.com)

[ () () () ]

[] 根节点 () 叶子节点

如果相邻满足左右括号 ( ) 情况则被合并。括号不断、依次被合并,括号的串逐渐变小。括号的合并方式具有唯一性。

要确保叶子节点先走(被合并),根节点在这些叶子节点走完了(被合并完了),才能走(才被合并)。

树的拓扑序计数

 

 

类似但实际不同:

括号序列 - OI Wiki (oi-wiki.org)

构造方式数目: catalan 卡特兰数 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795772.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人项目—论文查重

个人项目———论文查重这个作业属于哪个课程 计科12班这个作业的要求在哪里 作业要求这个作业的目标 实现论文查重,给定原文件和抄袭的文件,输出二者的相似度到答案文件中GitHub链接:github 1.题目要求 题目:论文查重 描述如下: 设计一个论文查重算法,给出一个原文文件和…

一款用于Redis漏洞的利用工具

Hack分享吧声明 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。工具介绍 @yuyan-sec使用golang写的一款Redis漏洞利用工具。 注意:主从复制会清空数据,主从复制会清空数据…

AGC007F Shik and Copying String

涉及知识点:Ad-hoc,贪心 题意 Link 给出两个长度相同的字符串 \(S,T\),定义一次操作为: 从头至尾处理每一位,每位可以变成上一位,或者不变。 求最少对 \(S\) 进行多少次操作使得 \(S=T\)。 思路 引理 可以发现,一次操作其实类似于选择一些点 \(l\),从左到右覆盖它后面的…

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法。这种模式在 Python 中广泛应用于事件处理、异步编程、函数式编程等场景。全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback摘要: 回调函数是编程中一种非常常见的…

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One Kindle 电子书如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In OneKindle 电子书https://www.bilibili.com/video/BV1nY4y1e7gC/?t=375 demosKindle Paperwhite 7 电子书阅读器(4GB)Kindle Paperwhi…

基于小波神经网络的数据分类算法matlab仿真

1.程序功能描述 基于小波神经网络的数据分类算法。输入为5个特征值,输出为判断(是,否)。拿50组数据对本算法作为训练组,后30组数据作为验证组。这里,我们首先调用数据,然后对50组数据进行训练,然后对30组数据进行识别测试。 2.测试软件版本以及运行结果展示MATL…

基于GWO灰狼优化的CNN-LSTM的时间序列回归预测matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = Alpx(1); numHiddenUnits1 = floor(Alpx(2))+1;% 定义隐藏层中LSTM单元的数量 numHiddenUnits2 = floor(Alpx(3)…

代码整洁之道--读书笔记(8)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

java学习9.11

IDEA里导入mybatis,lombok等依赖成功连接好数据库。 并将MYSQL数据库同时用navicat连接便利创建表等操作。设计实体类student并在数据库设计好表接下来就是如何实现在数据库里的增删改查 设计接口类mapper,将操作简化最后能正常运行实现功能。 总的来说这一块内容,刚开始学,…

LOJ4222 「IOI2024」马赛克上色 题解

题目描述 给定长为 \(n\) 、下标从零开始的 \(01\) 序列 \(x,y\) ,保证 \(x_0=y_0\) 。 令 \(col_{0,j}=x_j,col_{i,0}=y_i\) ,对 \(\forall 1\le i\lt n,1\le j\lt n\) , \(col_{i,j}=[col_{i-1,j}=0\and col_{i,j-1}=0]\) 。 \(q\) 次询问,给定 \(u,d,l,r\) ,求 \(\sum_…

2024 必收藏✨免费手机铃声下载网站大公开

最推荐的方式,当然是在线网站了。1.北岛铃声网 https://www.beidaols.cn/优点:免费下载:用户可以免费获取各种手机铃声,无需支付费用。 铃声多样:提供了丰富的铃声选择,满足不同用户的个性化需求。 教程详细:提供了详细的设置苹果铃声的教程,对于不熟悉苹果手机设置的…

原神蒙德-Typora模板

基于Newsprint主题开发的一种Typora模板新建模板 打开Typora - 文件 - 偏好设置 - 外观 - 打开主题文件夹 找到其中的 Newsprint (应该有一个文件夹+一个css,都要) ,拷贝副本,重命名(我命名的是“custom”),一定要这一步,不然后期更新的时候会覆盖 修改 打开其中的 cu…