【蓝桥杯】2016决赛 生成树计数

题目描述

给定一个 nm 的格点图,包含 n 行 m 列共 nm 个顶点,相邻的顶点之间有一条边。
下图给出了一个3*4的格点图的例子。
在这里插入图片描述

如果在图中删除部分顶点和其相邻的边,如上图删除第2行第3列和第3行第1列的顶点后,如下图所示。
在这里插入图片描述

图的生成树指包含图中的所有顶点和其中的一部分边,使得任意两个顶点之间都有由边构成的唯一路径。
如果两个生成树包含有不同的边即被认为不同,则上图中共有31种不同的生成树,其中a边不选有10种,a边选有21种。
给出格点图中保留的顶点的信息,请计算该图一共有多少种不同的生成树。
输入
输入的第一行包含两个整数n, m,用空格分隔,表示格点图的行数和列数。1<=n<=6,1<=m<=100000
接下来n行,每行m个字母(中间没有分隔字符)
每个字母必然是大写E或大写N,E表示对应的顶点存在,N表示对应的顶点不存在。保证存在至少一个顶点。
输出
输出一行,包含一个整数,表示生成树的个数。答案可能很大,你只需要计算答案除以1000000007的余数即可。

样例输入

3 4
EEEE
EENE
NEEE

样例输出

31

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回路计数问题是计算一个无向图中回路的个数。这里介绍一种基于矩阵树定理的方法。 矩阵树定理是一种计算图的生成树个数的方法,它利用的是一个图的拉普拉斯矩阵(Laplacian Matrix)的性质:生成树个数等于其拉普拉斯矩阵去掉任意一行和一列后的行列式。 对于一个无向图,我们可以将其转化为有向图,即对于每条无向边,我们将其拆成两条有向边,方向分别为两个端点指向对方。对于有向图,其拉普拉斯矩阵的定义如下: 设 $D$ 为 $n\times n$ 的度矩阵,$A$ 为 $n\times n$ 的邻接矩阵,则该有向图的拉普拉斯矩阵为 $L=D-A$。 对于无向图,其度矩阵 $D$ 是一个对角矩阵,其对角线元素为每个节点的度数。邻接矩阵 $A$ 中,若节点 $i$ 与节点 $j$ 相连,则 $A_{ij}=1$,否则 $A_{ij}=0$。由于无向图的邻接矩阵是一个对称矩阵,所以其拉普拉斯矩阵也是一个对称矩阵。其行列式可以通过高斯消元或利用矩阵的行列式计算公式来求解。 对于一个无向图 $G$,其回路计数可以通过拉普拉斯矩阵来求解。我们可以将其拉普拉斯矩阵的任意一行与一列删除,得到一个 $n-1\times n-1$ 的矩阵 $L_{ij}$。设 $T_{ij}$ 为以节点 $i$ 为根节点,节点 $j$ 为叶节点的生成树个数,则有: $$T_{ij}=\begin{cases}(-1)^{i+j}(L_{ij})^{*}&i\neq j\\d_i&i=j\end{cases}$$ 其中 $d_i$ 为节点 $i$ 的度数,$(L_{ij})^{*}$ 表示将 $L_{ij}$ 的第 $i$ 行和第 $j$ 列删掉后得到的 $(n-2)\times(n-2)$ 矩阵的行列式。 对于一个无向图,其回路计数为所有 $T_{ij}$ 的和,即: $$C=\sum_{i=1}^{n}\sum_{j=1}^{n}T_{ij}$$ 这个公式的时间复杂度为 $O(n^3)$,适用于小规模的无向图计算。对于大规模的无向图,可以使用基于矩阵树定理的快速算法来计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值