luogu P6178 【模板】Matrix-Tree 定理

1.无向图

假设现在给定一个图 G。

度数矩阵D:若存在边$ (x,y,z)(x,y,z)$ ,则 D[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=zD[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=zD[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=z;

邻接矩阵C:若存在边 (x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z) ,则C[x][y]+=z;C[y][x]+=z;C[x][y]+=z;C[y][x]+=zC[x][y]+=z;C[y][x]+=z;C[x][y]+=z;C[y][x]+=zC[x][y]+=z;C[y][x]+=z;C[x][y]+=z;C[y][x]+=z;

图G的基尔霍夫矩阵 A=D−CA=D−CA=D−CA=D−CA=D−CA=D−C。

删去任意一行和任意一列,求剩下的矩阵行列式即可。

2.有向图

假设现在给定一个图G.

度数矩阵D:若存在边$ (x,y,z)(x,y,z) ,则外向树中,则 外向树中,则外向树中D[y][y]+=z;D[y][y]+=z$; 内向树中 D[x][x]+=z;D[x][x]+=zD[x][x]+=z;D[x][x]+=zD[x][x]+=z;D[x][x]+=z;

邻接矩阵C:若存在边 (x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z) ,则 内向树和外向树中均为C[x][y]+=z;C[x][y]+=zC[x][y]+=z;C[x][y]+=zC[x][y]+=z;C[x][y]+=z;

图G的基尔霍夫矩阵 A=D−CA=D−CA=D−CA=D−CA=D−CA=D−C。

删去指定的根所在的行和列,求剩下的矩阵行列式即可。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}ll A[310][310];const int mod = 1e9 + 7;ll quick_pow(ll a, ll n, ll mod) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans;
}ll inv(ll a, ll n) {return quick_pow(a, mod - 2, mod);
}ll gauss(int n){ll ans = 1;for(int i = 2; i <= n; i++){for(int j = i; j <= n; j++) {if(A[j][i]){for(int k = i; k <= n; k++) swap(A[i][k], A[j][k]);if(i != j) ans = -ans;break;}}if(!A[i][i]) return 0;for(ll j = i + 1, iv = inv(A[i][i], mod); j <= n; j++) {ll t = A[j][i] * iv % mod;for(int k = i; k <= n; k++)A[j][k] = (A[j][k] - t * A[i][k] % mod + mod) % mod;}ans = (ans * A[i][i] % mod + mod) % mod;}return ans;
}void add(int x, int y, int w) {(A[x][y] -= w) %= mod;(A[y][y] += w) %= mod;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n = read(), m = read(), t = read();for(int i = 1; i <= m; i++) {int x = read(), y = read(), w = read();if(!t) {add(x, y, w);add(y, x, w);}else {add(x, y, w);}}printf("%lld\n", gauss(n));return 0;
}

luogu P6178 【模板】Matrix-Tree 定理相关推荐

  1. [学习笔记] Matrix tree定理

    前言 为了回归算法本身,为了搞懂算法,我参考了不同博客,并将他们做出整合和补充: https://www.luogu.com.cn/blog/tanrui-2960967961/matrix-tree ...

  2. 【luogu P6178】【模板】Matrix-Tree 定理(行列式)(数学)(树)

    [模板]Matrix-Tree 定理 题目链接:luogu P6178 题目大意 给你一个无向图或有向图,然后让你求它有多少种以 1 为根的外向生成树. 思路 玄学玩意儿. 原理自己上去搜题解,我也说 ...

  3. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 nnn,mmm,质数 p ...

  4. 洛谷——P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...

  5. bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)...

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...

  6. 计算任意一个图生成树的个数——Kirchhoff 的Matrix Tree 方法Java实现

    计算任意一个图的生成树的个数,是Kirchhoff提出的理论,通常称为Matrix Tree Theorem,原理很简单: Let G be a graph with V(G)={v1,v2,..., ...

  7. 洛谷 - P6178 【模板】Matrix-Tree 定理(矩阵树定理模板题)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的图,可能是有向图也可能是无向图,定义生成树的权值为所有边权的乘积: 如果是无向图,求所有生成树的权值之和 如果是有向图,求所有以点 1 ...

  8. [BZOJ4596][Shoi2016]黑暗前的幻想乡-Matrix Tree 矩阵树定理

    黑暗前的幻想乡 Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日 ...

  9. 洛谷P3807 【模板】卢卡斯定理exgcd

    题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105 ) 求 C_{n+m}^{m}\ mod\ pCn+mm​ mod p 保证P为pri ...

最新文章

  1. C++11中nullptr的使用
  2. 《LeetCode力扣练习》第3题 C语言版 (做出来就行,别问我效率。。。。)
  3. 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
  4. 什么是云计算机服务器,云电脑服务器是什么
  5. parameter乱码提交的问题
  6. 面试系列26 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试
  7. 全局缓存管理工具-安装部署时提供小小的方便
  8. mybatis------通过mapper接口加载映射文件(六)
  9. 手机不支持温度传感器为什么鲁大师可以检测手机电池的温度?
  10. python机器学习案例系列教程——基于规则的分类器
  11. sql server去空格函数LTRIM()RTRIM(),判断是否为空函数isnull(),以及获取字符串长度len()的使用方法
  12. 缺少JAVA环境,无法运行软件解决办法
  13. 综合布线3D虚拟仿真教学实训平台
  14. python3定义函数_[Python3] 函数定义与使用[TZZ]
  15. 从C/C++到Python(之二)(By Robinvane Suen)
  16. java 1 2 等于_java 判断语句中一个等于号和两个等于号的区别是什么?
  17. 重贴:MFC类中获得其它类指针 (转)
  18. 一次云服务器购买经历,给个人建站的小白做些参考
  19. 世界上的第一台计算机什么样,世界上第一台计算机是什么样的
  20. python3基础教程雪峰_[雪峰磁针石博客]python3快速入门教程2数据结构1变量与赋值...

热门文章

  1. hfss史密斯图_HFSS仿真工程实例 (微波器件).ppt
  2. geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
  3. css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪
  4. 男人都应该懂的一张图。。 | 今日趣图
  5. 不爱读书怎么办?用这个新奇的方法,熟知137亿年来的地球通史
  6. idea mysql 创建表_idea 根据数据库表自动创建持久化类
  7. bat脚本中获取上级目录_使用Python写一个可以监控Tomcat 运行的脚本,并且把.py文件转换成.exe文件...
  8. 重力模型matlab代码,STK基础教程.doc
  9. oracle 参照完整性,Oracle中用表外键来保证系统参照完整性
  10. linux启动xorg进程,Linux 黑话解释:Xorg,X11,Wayland,什么是显示服务器