Matrix-tree定理

前言

之前学了一遍
发现只会无向图生成树
于是就在这里总结一下各种结论吧

定义

有向树:对于一个有向图,如果无视边的方向是一棵树,那么此有向图就称为有向树
外向树:有向树的特殊情况,下同,所有边的方向都是从根指向叶子
内向树:所有边的方向都是从叶子指向根

求法

无向图

定义一张图的基尔霍夫矩阵为
两个点i,j,如果i=j,那么他在基尔霍夫矩阵中的权为i点在图中的度数
如果i≠j,且i到j有一条边,那么他在基尔霍夫矩阵中的权为-1
那么这张图的生成树个数即为这张图的基尔霍夫矩阵的任意一个n-1阶主子式的行列式的绝对值
什么叫n-1阶主子式?对于i,去除第i行第i列后的矩阵即为n-1阶主子式

有向图

外向树:
i≠j且i到j有一条有向边的情况下,基尔霍夫矩阵的权依然为-1
i=j的情况下,基尔霍夫矩阵的权为i的入度

内向树:
i≠j且i到j有一条有向边的情况下,基尔霍夫矩阵的权依然为-1
i=j的情况下,基尔霍夫矩阵的权为i的出度

后把根所在的行与列删去,高斯消元解行列式即可
注意模数不为质数的情况下要辗转相除
否则可以直接取逆元

模板

int gauss()
{
    n--;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)a[i][j]=(a[i][j]+mod)%mod;
    int ans=1;
    for(int j=1;j<=n;j++)
    {
        for(int i=j+1;i<=n;i++)
            while(a[i][j])
            {
                int tmp=a[j][j]/a[i][j];
                for(int k=j;k<=n;k++)
                    a[j][k]=(a[j][k]-tmp*a[i][k]%mod+mod)%mod,swap(a[j][k],a[i][k]);
                ans*=-1;
            }
        ans=ans*a[j][j]%mod;
    }
    return (ans+mod)%mod;
}

拓展

听说还可以求边权乘积和…(=1的时候不就是1嘛qwq…
把基尔霍夫矩阵的 a i , i a_{i,i} ai,i设为与该点相连的边的边权和
两点之间设为边权的相反数
理性理解

重边奇奇妙妙…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值