Prufer序列 生成树定理

Description

在图论中,树的定义是连通且无环的无向图。对于一棵有 nn 个节点且节点从 11 到 nn 编号的树,它的 Prufer 序列是一个唯一的长为 n2n−2 的标号序列。 Prufer 序列的构造方法:每次删除树中标号最小的叶子节点(即度为 11 的节点),将该点的邻居加到当前 Prufer 序列的末尾,直到只剩两个节点为止。

例子:

给定一个 nn 个顶点(从 11 到 nn 标号), mm 条边的无向图 GGGG 中无重边或自环)。随机选择 GG 的一棵生成树,计算他的 Prufer 序列的和 SS重复元素只算一次。 请计算随机变量 SS 的期望。注意,GG 的生成树或某棵生成树的 Prufer 序列都可能不存在,这种情况下,我们认为随机变量 SS 的值为 00

为了避免精度问题, 算出实际的期望值乘以图 GG 的不同生成树的数目以后的值即可。 这个值可能很大,请输出它对 109+7109+7 取模以后的值。

Input

每个输入文件包含多组测试数据。输入文件的第一行是测试数据组数 TT (T10T≤10)。 对于每组测试数据,第一行是两个整数 n,mn,m (3n100,0m(n1)n23≤n≤100,0≤m≤(n−1)n2 ),分别是图的点数和边数;接下来 mm 行,每行包含两个整数 u,vu,v1u,vn1≤u,v≤nuvu≠v),表示图中的一条边。

Output

输出 TT 行,每行是对应的答案。

Sample Input

1
3 3
1 2
2 3
1 3

Sample Output

6

题目大意:求所有生成树的prufer序列和(prufer中有重复序列的只算一次!!!)

题解:

这样的话,对于每一颗生成树,我们可以把所有的点全都加进去,然后再减去叶子结点的和。

我们不可能找到所有的生成树然后一个一个的计算,因此我们用矩阵树定理来做。

我们先计算图所有的点的和,并且乘以生成树的数量,把他们放在sum里。然后再把所有的叶子结点减去,就好了

如果一个叶子节点出现在一颗子树里,那么把这个点去掉,仍然可一得到图的该生成树,而如果这个点是内部节点就不行了。

注意:如果这个叶子节点的度不为1,那么要用这个叶子节点的度数乘以生成树的数量,才是这个叶子节点对应生成树的个数。

sum -= 去掉该节点生成树的数量*该节点的度*该节点的值。

最后得到的sum就是答案

代码:

#include<iostream>。
#include<cmath>
#include <cstring>
using namespace std;
#define zero(x)((x>0? x:-x)<1e-15)
#define int long long
int const MAXN = 105;
const int mod = 1e9 + 7;
int a[MAXN][MAXN];
int b[MAXN][MAXN];
int g[103][103];
int d[105];
int n, m;
int det(int a[MAXN][MAXN], int n){ int s=0;for(int i=0; i<n; i++){ int r=i; for(; r<n; r++)    // error-prone if(a[r][i]) break; if(r==n+1) return 0; if(r!=i){ s^=1; for(int j=i; j<n; j++) swap(a[i][j], a[r][j]); } for(int j=i+1; j<n; j++){ int x=i, y=j; for(; a[y][i]; ){ // print(a, n); int t=a[y][i]/a[x][i]; if(t){ for(int k=i; k<n; k++){ a[y][k] -= t*a[x][k]%mod; a[y][k] %= mod; } if(a[y][i]==0) break; } swap(x, y); } if(x!=i){ for(int k=i; k<n; ++k) swap(a[x][k], a[y][k]); s ^= 1; } } } int res=1; for(int i=0; i<n; i++) res*=a[i][i], res%=mod; if(s){ res=-res; }if(res < 0) res+=mod; return res; 
} void prep(int n,int x)
{for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){a[i][j] = (i == j)?d[i]-g[i][x]:-g[i][j];}}if(x + 1){for(int i = 0;i < n;i++) a[x][i] = a[i][x] = 0;a[x][x] = 1;}
}main() 
{	int cas;scanf("%lld", &cas);while (cas--) {memset(g,0,sizeof(g));memset(d,0,sizeof(d));memset(a,0,sizeof(a));memset(b,0,sizeof(b));scanf("%lld%lld", &n,&m);for(int i = 0;i < m;i++){int u,v;scanf("%lld%lld",&u,&v);u--,v--;d[u]++;d[v]++;g[u][v] = g[v][u] = 1;}prep(n,-1);int sum = det(a,n-1)*((1+n)*n/2) % mod;for(int i = 0;i < n-1;i++){prep(n,i);sum = (sum - (i+1)*d[i] % mod * det(a,n-1) % mod + mod)%mod;//cout<<':'<<sum<<endl;}prep(n,n-1);sum = (sum - n*d[n-1] % mod * det(a,n-2) % mod + mod)%mod;cout<<sum<<endl;}return 0;
}





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

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

相关文章

K8S Learning(10)——Pod配置

pod.spec.containers属性是pod配置中最为关键的一项配置。 kubectl explain pod.spec.containersKIND: Pod VERSION: v1 RESOURCE: containers <[]Object> # 数组&#xff0c;代表可以有多个容器 FIELDS:name <string> # 容器名称image <string>…

NOI.AC-积木【堆】

正题 题目链接:http://noi.ac/contest/266/problem/794 题目大意 无限多个1∗21*21∗2的砖块交替着 一个砖块会掉落仅当下方两个砖块都掉落&#xff0c;现在抽出nnn个砖块&#xff0c;求掉落多少个砖块。 解题思路 开一个优先队列&#xff0c;若两个连在一起的就把上面那个…

L3-002 堆栈 树状数组+二分答案

题目详情点击这里 思路&#xff1a;用std::stack来表示题目中说的栈&#xff0c;现在关键问题就是如何找到中位数。 可以用二分答案&#xff0b;树状数组的方法 由于每个元素最大不超过1e5&#xff0c;因此开一个大小为1e5的树状数组来存储不超过x的数有多少个 每次push一个…

K8S Learning(11)——Pod生命周期

一、Pod生命周期 一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#…

大规模开发团队如何实现DevOps转型? 来自微软全球开发平台工程团队的实践经验

微软全球开发平台工程团队从敏捷到DevOps的转型2013年11月13日&#xff0c;我们宣布了Visual Studio2013&#xff0c;以及微软研发云Visual Studio Online (VSO)的正式商用。紧接着我们经历了一次长达七小时的服务中断。我们的服务运行在一个“弹性扩展单元”中&#xff0c;为大…

NOI.AC-保镖【贪心,对顶堆】

正题 题目链接:http://noi.ac/contest/266/problem/795 题目大意 nnn个人第iii个巡逻一次aia_iai​秒&#xff0c;休息至少bib_ibi​秒。 要求 任意时刻都有人巡逻在一个人的两次相邻的巡逻直接不能有另一个人巡逻两次。 解题思路 对于性质二我们发现就是在nnn个人里选择最少…

L2-013 红色警报 并查集

题目连接 题解&#xff1a;连通块问题显然要与并查集有关&#xff0c;而且C4比赛极喜欢出与并查集有关的知识。 这道题可以这样做&#xff0c;即我每次去掉一个城市的时候&#xff0c;都对剩余的城市重新建立并查集&#xff0c;然后判断联通块的数量有没有删减&#xff0c;如…

野鸡NOI.AC模拟赛【2019.10.26】

前言 截止至2019.10.2614:222019.10.26\ \ \ \ 14:222019.10.26 14:22 成绩 正题 T1:NOI.AC−T1:NOI.AC-T1:NOI.AC−序列【堆】 https://blog.csdn.net/Mr_wuyongcong/article/details/102755906 T2:NOI.AC−T2:NOI.AC-T2:NOI.AC−积木【堆】 https://blog.csdn.net/Mr_wu…

Golang的CSP很酷?其实.NET也可以轻松完成

CSP&#xff08;Communicating sequential processes&#xff09;这东西我一开始以为很简单&#xff0c;后面差了资料发现它独树一帜&#xff0c;自己是一门语言&#xff0c;也是一套理论。这边我不深入的对它做过多的见解&#xff0c;我怕耽误大家_&#xff0c;大家可以看看wi…

K8S Learning(12)——Pod调度

一、Pod调度 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到…

jzoj3801-[NOIP2014模拟8.23]骰子【数学期望】

正题 题目链接:https://jzoj.net/senior/#main/show/3801 题目大意 mmm面的骰子是1∼m1\sim m1∼m&#xff0c;然后丢nnn次&#xff0c;求最大值的数学期望。 解题思路 若抛到的数都≤i\leq i≤i那么期望概率就是(1i)n(\frac{1}{i})^n(i1​)n 我们考虑若iii是最大值时概率就是…

L2-016 愿天下有情人都是失散多年的兄妹 CCCC

呵呵。大家都知道五服以内不得通婚&#xff0c;即两个人最近的共同祖先如果在五代以内&#xff08;即本人、父母、祖父母、曾祖父母、高祖父母&#xff09;则不可通婚。本题就请你帮助一对有情人判断一下&#xff0c;他们究竟是否可以成婚&#xff1f; 输入格式&#xff1a; 输…

SpringBoot2.1.9 多MongoDB配置自动扫描

一、配置文件 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> application.yml spring:application:name: double-mongoprofiles:active…

SignalR Core尝鲜

要点SignalR Core改用Microsoft.AspNetCore.Sockets&#xff0c;不再依赖HTTP。使用MessagePack序列化格式&#xff0c;支持二进制协议。TypeScript客户端移除了第三方依赖包。支持WebSocket原生客户端&#xff0c;可以使用自己构建的客户端连接到SignalR服务器。伸缩方式更灵活…

2016陕西省ACM省赛 HE 字符串处理 删除注释

HE 发布时间: 2017年3月27日 18:28 最后更新: 2017年3月27日 18:30 时间限制: 1000ms 内存限制: 256M 描述 "Hi there, my name is HE." 在某个秘密的计算机实验室中&#xff0c;超级人工智能计算机 HE 诞生了。 HE 可以在网络中搜索合适的程序代码进行自我升级…

SpringBoot2.1.9 MongoDB逻辑操作

一、基础类配置 NoRepositoryBean public interface IMongoRepository<T, ID> extends MongoRepository<T, ID> {String getTableName();void deleteAll(Collection<ID> ids);MongoOperations getMongoOperations();MongoEntityInformation<T, ID> ge…

牛客-Forsaken喜欢独一无二的树【并查集,最小生成树】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1221/H 题目大意 给一张图&#xff0c;要求删掉一些边使得最小生成树权值不变&#xff0c;然后求删掉的边的最小权值。 解题思路 我们假设能够构成最小生成树的边权之和为sumsumsum&#xff0c;最小生成树的边权之和为kk…

2016陕西省ACM 热身体B 种类并查集

Energy 发布时间: 2017年3月27日 11:31 最后更新: 2017年3月27日 18:30 时间限制: 1000ms 内存限制: 256M 描述 人类准备发射载人飞船前往火星。 飞船使用了一种特殊的反物质燃料来作为动力&#xff0c;在飞船的制造期间&#xff0c;同时人类也在从宇宙 的各个地方收集这…

P2519-[HAOI2011]problem a【dp】

正题 题目链接:https://www.luogu.org/problem/P2519 题目大意 nnn个人&#xff0c;第iii个人说aia_iai​个人比他高&#xff0c;bib_ibi​个人比他低&#xff0c;允许有相同分数&#xff0c;求最少多少人在说谎。 解题思路 我们改为求最多有多少人在说真话&#xff0c;我们发…

kubernetes实践之运行aspnetcore webapi微服务

1、预备工作unbuntu 16.04 or abovedocker for linuxkubernetes for linux 集群环境2、使用vs2017创建一个web api应用程序&#xff0c;并打包镜像到本地。3、推送本地镜像到docker hub4、编写k8s资源配置文件(yml)hello-world-deployment.yml如下上面replicas部署两个副本实例…