矩阵生成树

对于每条连边i->j,a[i][j]--,a[i]++

对无向图有向图同时成立

求矩阵det即可

--------------------

BZOJ3659

wikipeida:

We denote these in- and out-degree of a vertex v by deg(v).

The BEST theorem states that the number ec(G) of Eulerian circuits in a connected Eulerian graph G is given by the formula

将结果乘上根节点出度即可

#include <cstdio>
#define LL long long 

  const LL mo=1000003;

  LL a[101][101],fac[200001],num[101];

  LL qpow(LL bas,int powe){
      LL ret=1;
      for (;powe;bas*=bas,bas%=mo){
        if (powe&1) ret*=bas,ret%=mo;
      powe=powe>>1;
    }
    return(ret);
  }

  LL work(int n){
    for (int i=1;i<=n;i++){
      for (int j=i+1;j<=n;j++){
          LL bas=a[j][i]*qpow(a[i][i],mo-2)%mo;
          for (int k=i;k<=n;k++)
            a[j][k]-=a[i][k]*bas%mo,a[j][k]%=mo,a[j][k]+=mo,a[j][k]%=mo;
      }
    }
    LL ret=1;
    for (int i=1;i<n;i++) ret*=a[i][i],ret%=mo;
    return(ret);
  }

  int main(){
      fac[0]=1;
      for (int i=1;i<=200000;i++) fac[i]=fac[i-1]*i%mo;
      int n;
      while (scanf("%d",&n)!=EOF,n!=0){
         for (int i=1;i<=n;i++)
       for (int j=1;j<=n;j++)
         a[i][j]=0;
      for (int i=1;i<=n;i++){
          scanf("%d",&num[i]);
          for (int j=1;j<=num[i];j++){
            int tt;
            scanf("%d",&tt);
          a[i][tt]--;a[i][i]++;
        }
      }
      for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) a[i][j]%=mo,a[i][j]+=mo,a[i][j]%=mo;
      LL ans=1;
      for (int i=1;i<=n;i++) ans*=fac[num[i]-1],ans%=mo;
      ans*=work(n);ans%=mo;
      ans*=num[1];ans%=mo;
      printf("%lld\n",ans);
    }
  } 
时间: 2024-10-25 08:19:03

矩阵生成树的相关文章

JZOJ5153:树形图求和

Description Input Output HINT 题解: 一种很直观的想法是通过矩阵生成树求树形图方法数ans以及不包含某一条边i的树形图方法数ans[i],则答案为Σ(ans-ans[i])*w[i]. 对于树形图,矩阵生成树的建立方法是:将有向边(u,v)加入,即inc(A[u,u])(如果是要求n能够走到所有点则inc(A[v,v])),dec(A[u,v]). 删去第n行与第n列后,求行列式(即m[n,n],m为余子式矩阵). 对于要删去某条边情况下的m[n,n],只要修改矩阵

【bzoj2467】[中山市选2010]生成树 矩阵树定理

题目描述 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树. 注意:在给定的n五角形圈中所有顶点均视为不同的顶点. 输入 输入包含多

hdu4305Lightning 生成树计数(基尔霍夫矩阵)+高斯消元+逆元

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4305 题意:比较裸的生成树计数问题. 如何处理生成树计数问题? 基尔霍夫矩阵: if i==j  Kir[i][j] = i的度数 if i!=j   Kir[i][j] = i到j的平行边的个数的负数 即,基尔霍夫矩阵 = 度数矩阵 - 邻接矩阵 将基尔霍夫矩阵删去第i行和第i列,余下i-1阶的行列式的值即为生成树个数.(证明略) 求行列式的值可以将行列式转为上三角阵,求对角线上的积即为行列式的值.

luogu P2144 [FJOI2007] 轮状病毒 矩阵(da)生成树(biao)+高精

传送门 明显的生成树 所以矩阵统计完全图的生成树计数就OK ......原地懵逼 并不会行列式 等等 完全图 果断列了一个矩阵(主对角线N*(N-1)/2,其他(N-1)) (当然是3*3矩阵和4*4矩阵) 然后搞了一个互相推 ....30minutes later...... 两个矩阵推不出来 试试三个 (当然是2,3,4) ....20minutes later...... 发现满足f[n] = f[n-1] * 3 - f[n-2] + 2 (鬼知道我是怎么发现的) 1和2可以手胡 然后n

6461. 【GDOI2020模拟02.05】生成树(矩阵树及其扩展、二维拉格朗日插值)

题目描述 给定一张 N 个点,M 条边的无向图,边有红.绿.蓝三种颜色,分别用 1,2,3 表示. 求这张图有多少生成树,满足绿色边数量不超过 x,蓝色边数量不超过 y,答案对10^9 + 7 取模. 1 ≤ N ≤ 40,1 ≤ M ≤ 10^5,1 ≤ ci ≤ 3 行列式 定义矩阵A的行列式det(A)或|A| \(|A|=\sum_{排列p}{(-1)^{p的逆序对个数}\prod{A_{i,p[i]}}}\) 行列式的性质 (\(A\)的转置矩阵\(A^T\):把\(A\)的行列互换)

[spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of cities that can be c

线性代数(矩阵乘法):NOI 2007 生成树计数

这道题就是深搜矩阵,再快速幂. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <map> 5 using namespace std; 6 const int maxn=200; 7 const int mod=65521; 8 struct Matrix{ 9 long long mat[maxn][maxn]; 10 int r,c; 11 Matrix

bzoj1494 生成树计数 (dp+矩阵快速幂)

题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种. 我们把它们用类似于并查集的方式表达(比如12132代表点1和点3连通,2和5连通,3自己),然后再压缩一下. 但要注意的是,12132和23213这两种实际对应的是一种连通情况,我们只要把它都化成字典序最小的那种就可以了 然后考虑增加一个新点以后状态的转移,可以枚举这个点与前k个点(始状态S)的连边情况,其中有一些

无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

基尔霍夫矩阵 https://blog.csdn.net/w4149/article/details/77387045 https://blog.csdn.net/qq_29963431/article/details/51236064 题目链接  https://vjudge.net/problem/SPOJ-HIGH AC代码 1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define