C++ 生成树计数 快速幂和矩阵 快速幂 NOI 2007 高斯消元

描述

最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现:

  • n 个结点的环的生成树个数为 n。
  • n 个结点的完全图的生成树个数为 nn−2 。

这两个发现让小栋欣喜若狂,由此更加坚定了他继续计算生成树个数的想法,他要计算出各种各样图的生成树数目。

一天,小栋和同学聚会,大家围坐在一张大圆桌周围。小栋看了看,马上想到了生成树问题。如果把每个同学看成一个结点,邻座(结点间距离为 1)的同学间连一条边,就变成了一个环。可是,小栋对环的计数已经十分娴熟且不再感兴趣。于是,小栋又把图变了一下:不仅把邻座的同学之间连一条边,还把相隔一个座位(结点间距离为 2)的同学之间也连一条边,将结点间有边直接相连的这两种情况统称为 有边相连,如图 1 所示。

image.png

小栋以前没有计算过这类图的生成树个数,但是,他想起了老师讲过的计算任意图的生成树个数的一种通用方法:构造一个 n×n 的矩阵 A={ai,j​},其中:

ai,j​=⎩⎪⎪⎨⎪⎪⎧​di​−10​i=ji,j 之间有边直接相连其他情况​

与图 1 相应的 A 矩阵如下所示。为了计算图 1 所对应的生成数的个数,只要去掉矩阵 A 的最后一行和最后一列,得到一个 (n−1)×(n−1) 的矩阵 B,计算出矩阵 B 的行列式的值便可得到图 1 的生成树的个数。

A=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​4−1−1000−1−1​−14−1−1000−1​−1−14−1−1000​0−1−14−1−100​00−1−14−1−10​000−1−14−1−1​−1000−1−14−1​−1−1000−1−14​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​,B=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​4−1−1000−1​−14−1−1000​−1−14−1−100​0−1−14−1−10​00−1−14−1−1​000−1−14−1​−1000−1−14​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​,

所以生成树的个数为 detB=3528。小栋发现利用通用方法,因计算过于复杂而很难算出来,而且用其他方法也难以找到更简便的公式进行计算。于是,他将图做了简化,从一个地方将圆桌断开,这样所有的同学形成了一条链,连接距离

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值