前言
之前学了一遍
发现只会无向图生成树
于是就在这里总结一下各种结论吧
定义
有向树:对于一个有向图,如果无视边的方向是一棵树,那么此有向图就称为有向树
外向树:有向树的特殊情况,下同,所有边的方向都是从根指向叶子
内向树:所有边的方向都是从叶子指向根
求法
无向图
定义一张图的基尔霍夫矩阵为
两个点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设为与该点相连的边的边权和
两点之间设为边权的相反数
理性理解