【learning】矩阵树定理

news/2024/7/7 19:00:55

问题描述

  给你一个图(有向无向都ok),求这个图的生成树个数
  

一些概念

  度数矩阵:\(a[i][i]=degree[i]\),其他等于\(0\)

  入度矩阵:\(a[i][i]=in\_degree[i]\),其他等于\(0\)

  出度矩阵:\(a[i][i]=out\_ degree[i]\),其他等于\(0\)

  邻接矩阵:\(边集a[i][j]=[(i,j)\in 边集]\)

  基尔霍夫矩阵:度数矩阵-邻接矩阵

  

  外向树:长成树的样子但是边有方向,方向为根-->叶子

  外向树:长成树的样子但是边有方向,方向为叶子-->根
  

前置技能

行列式

  因为接下来可能需要用到行列式中的某些概念所以还是简单讲一下吧(额只挑部分来讲毕竟我比较菜qwq)

  上三角矩阵:就是。。只有主对角线及其上方的位置有值的行列式,主对角线以下的部分都是\(0\)

  行列式的求值:我们可以先用高斯消元把这个行列式消成一个上三角矩阵的形式然后直接把对角线上的数乘起来得到这个行列式的值

  余子式:一个行列式的余子式就是这个行列式去掉任意一行一列后剩下的那个少了一维的行列式
  

具体内容

无向图的生成树计数

  无向图的话生成树个数就是这个图的基尔霍夫矩阵的任意一个余子式的行列式值

有向图的生成树计数

​  有向图的话分成两种情况:

​  1、求外向树:那么将无向图中的度数矩阵改成入度矩阵

​  2、求内向树:将无向图种的度数矩阵改成出度矩阵

​  不过需要特别注意的一点是:有向图的话余子式去掉的行、列必须是根节点对应的那个

(是不是特别特别简洁明了ovo)

​  p.s.其实在有重边的情况下这个也是成立的只不过在邻接矩阵那里有多少条边就要加多少而不是单纯是\(1\)

  

证明

​  这是一个要慢慢填的坑。。。
  

例题

  这里放一道模板题好了,另外还有几道相对来说貌似也是挺裸的,会在最后提供传送门这里就不贴详细啦

Portal-->bzoj4031小z的房间

  需要稍微注意一下的是,对于不能去的房间,要直接整个房间删掉(因为根本就不在连通的考虑范围内),还有就是注意这个模数不是质数所以要辗转相除一下(其实就是高消那里换成不为\(0\)就一直除除除除除就好了嗯)

  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int N=110,MOD=1e9;
const int dx[2]={-1,0},dy[2]={0,1};
ll a[N][N],rec[N][N],id[N][N];
char mp[N][N];
int n,m,ans,cnt;
void prework();
int solve(int n);
bool ok(int x,int y);int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);
#endifscanf("%d%d\n",&n,&m);for (int i=1;i<=n;++i){for (int j=1;j<=m;++j)scanf("%c",&mp[i][j]);scanf("\n");}prework();ans=solve(cnt-1);printf("%d\n",ans);
}void prework(){int x,y,id1,id2;for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)if (mp[i][j]=='.') id[i][j]=++cnt;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){if (!ok(i,j)) continue;id1=id[i][j];for (int k=0;k<2;++k){x=i+dx[k]; y=j+dy[k];if (!ok(x,y)) continue;id2=id[x][y];++a[id1][id1]; ++a[id2][id2];--a[id1][id2]; --a[id2][id1];}}}
}bool ok(int x,int y){if (x<1||x>n||y<1||y>m) return false;if (mp[x][y]=='*') return false;return true;
}int solve(int n){int id,mark=1;int tmp;for (int i=1;i<=n;++i){id=i;for (int j=i+1;j<=n;++j)if (a[j][i]){id=j;break;}if (id!=i){mark=-mark;for (int j=1;j<=n;++j) swap(a[id][j],a[i][j]);}for (int j=i+1;j<=n;++j){while (a[j][i]){tmp=a[j][i]/a[i][i];for (int k=1;k<=n;++k)a[j][k]=(1LL*a[j][k]+MOD-1LL*tmp*a[i][k]%MOD)%MOD;if (a[j][i]==0) break;mark=-mark;for (int k=1;k<=n;++k)swap(a[j][k],a[i][k]);}}}int ret=mark;for (int i=1;i<=n;++i) ret=1LL*ret*a[i][i]%MOD;return (ret+MOD)%MOD;
}

  

  
  其他的一些题目(是blog的传送门哦,题面传送门的话在blog里面也有)

Portal-->bzoj4894天赋

Portal-->bzoj1002轮状病毒(这题很假对这题很假)

Portal-->bzoj4596黑暗前的幻想乡

转载于:https://www.cnblogs.com/yoyoball/p/9226436.html


http://lihuaxi.xjx100.cn/news/255513.html

相关文章

硅谷华人码农艰难「求生」:陪马斯克熬夜奋战后光速被裁!

视学算法报道 编辑&#xff1a;David Cris【导读】前一晚还在与马斯克并肩作战&#xff0c;早上起床后公司账号就进不去了&#xff1f;这就是科技寒潮下的「硅谷速度」…根据Layoffs.fyi的统计&#xff0c;今年迄今科技行业累计裁员人数已超10万&#xff0c;其中大部分集中在M…

中国移动数据大赛来了!

第二届中国移动“梧桐杯”大数据应用创新大赛于4月6日正式启动报名啦&#xff01;本届大赛基于中国移动丰富数据资产和核心能力优势&#xff0c;面向广大高校&#xff0c;发掘青年学生优秀大数据应用创意能力&#xff0c;推动大数据产学研用深度融合&#xff0c;打造大数据行业…

WordPress首页调用QQ签名

我的博客&#xff1a;http://Yourtion.TK 看到我的博客的朋友一定注意到我的页面旁边一个QQ签名的实时显示&#xff0c;如下图&#xff1a; 是怎么实现的呢&#xff1f;&#xff1f;下面一步步告诉你。希望对你有帮助。 首先登陆QQ滔滔首页&#xff1a;http://www.taotao.com/并…

如何保证 Controller 的并发安全

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典单例模式&#xff08;Singleton&#xff09;是程序设计中一种非常重要的设计模式&#xff0c;设计模式也是Java面试重点考察的一个方面。面试经常会问到的一个问题是&#xff1a;SpringMVC中的Controller是单例还是多例&…

网站速度优化模块HttpCompressionModule

为了优化网站的访问速度&#xff0c;准备采用HttpCompressionModule 6对传输数据进行压缩&#xff0c;下载了HttpCompressionModule 6 , 并按照示例程序中的web.config配置了网站的web.config。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:offi…

手把手快速实现 Resnet 残差模型实战

作者 | 李秋键 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 引言&#xff1a;随着深度学习的发展&#xff0c;网络模型的深度也随之越来越深&#xff0c;但随着网络模型深度的加深&#xff0c;往往会曾在这随着模型深度的加大&#xff0c;模型准确率反而下降的问…

LeetCode实战:缺失的第一个正数

题目英文 Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2,0] Output: 3Example 2: Input: [3,4,-1,1] Output: 2Example 3: Input: [7,8,9,11,12] Output: 1Note: Your algorithm should run in O(n) time and u…

Javascript使用三大家族和事件来DIY动画效果相关笔记(一)

1.offset家族◆offsetWidth和offsetHeight表示盒子真实的宽度高度&#xff0c;这个真实的宽度包括 四周的边框、四周的padding、及定义的宽度高度或内容撑开的高度和宽度&#xff0c;可以用来检测盒子实际的大小&#xff0c;属性也是只读不可写的&#xff0c;返回的是不带单位的…