• 【算法专题】生成树计数(矩阵树定理)


    【排列】

    对于1~n的一个排列,定义对换:交换两个相邻元素的位置形成新的排列。

    每次对换:要么消除一个逆序对,要么创造一个逆序对,可以证明当序列中不存在相邻逆序对时,序列升序排列。

    所以对于给定排列,通过对换得到升序数列的次数奇偶性就是逆序对个数的奇偶性。

    【行列式】

    仅方阵有行列式。

    $det(A)=sumlimits_{σ}sign(σ)A_{1,σ1}A_{2,σ2}...A_{n,σn}=|A|$

    其中σ表示1~n的一个排列,sign(σ)根据排列的奇偶性决定(奇-1偶+1),此式实际上是每行每列取一个数的所有情况,对每种情况计算乘积*奇偶性。

    为了求解行列式,我们需要以下性质和推论:

    1.两行互换,行列式变号

    两行互换一定对换了2*(j-i)-1次,所有排列的逆序对奇偶性改变。

    2.两行相同,行列式为0。

    两行相同时,对于一个x行选i和y行选j的排列,必然存在一个x行选j和y行选i的排列,数值相同奇偶性相反,故行列式为0。

    3.对一行全部*k,行列式*k。

    每个排列有且只有一个该行元素,所以答案*k。

    4.两行成倍数,行列式为0。

    对于一个两行相同的矩阵,由2得行列式为0。其中一行乘以倍数,由3得0*k=0,故行列式为0。

    5.两个只有一行不同的矩阵,它们的行列式之和等于将这行加起来其余不变的矩阵的行列式。

    考虑每个经过该行一个数字的排列,两个矩阵的该排列之和是两行加起来的矩阵的该排列之和。

    6.一个矩阵的一行乘倍数后加到另一行上,行列式不变

    将矩阵由性质5拆成两个矩阵——一个原矩阵两行为i和j,一个为j*k和j,其中第二个矩阵由4得行列式为0,则行列式和原矩阵相同。

    由上面的1和6就可以对矩阵进行高斯消元,最终得到右上的倒三角矩阵后主对角线的乘积就是行列式(只剩这一排列)。

    定义余子式Mij表示除去i行j列后的剩余n-1阶矩阵的行列式。

    其它无关的性质:|A|=|AT|,|AB|=|A||B|,行列式等于所有n-1阶余子式*对应值的和。

    【矩阵树定理】Matrix-Tree

    定义基尔霍夫矩阵为:n阶方阵(n为点数),对于a[i][j],deg[i]为i的入度,则有:

    i=j,a[i][i]=deg[i]

    i≠j且i-->j,a[i][j]=-1(若有重边,则为-重边条数)

    a[i][j]=0

    无向图的生成树数就是其基尔霍夫矩阵的任意n-1阶余子式。

    有向图的树形图数是删除第x行和第x列的n-1阶余子式,其中x为选做为根的节点。

    ★例题:【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞

  • 相关阅读:
    颜色混合openglglBlendFunc函数
    Types of Maps
    ogre 检测显卡gpu支持参数
    (转载)lua和c/c++互相调用实例分析
    光照模型
    阴影(转载)
    eval()解析JSON
    android中The connection to adb is down,问题和解决 AndroidEclipseAntXML
    比较android中的像素单位dp、px、pt、sp
    区别:DOM Core 与 HTMLDOM
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8134463.html
Copyright © 2020-2023  润新知