结论:一个图的生成树个数等于它的度数矩阵减邻接矩阵得到的矩阵(基尔霍夫矩阵)的任意一个n-1阶主子式的行列式的绝对值

证明:不会

求法:高斯消元

例题:[HEOI2013]小Z的房间

#include <iostream>
#include <cstdio>
#include <cstring>
#define int long long
using namespace std;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0},mod=1e9;
int n,m,mp[10][10],kir[90][90],cnt;
char s[10][10],ch[10];
inline bool ck(int x,int y) {return x&&(x<=n)&&y&&(y<=m)&&mp[x][y];}
inline void add(int x,int y) {if(x>y) return;kir[x][x]++,kir[y][y]++,kir[x][y]--,kir[y][x]--;}
inline int gauss() {
int ans=1;
for(int i=1;i<cnt;i++) {
for(int j=i+1;j<cnt;j++)
while(kir[j][i]) {
int p=kir[i][i]/kir[j][i];
for(int k=i;k<cnt;k++)
kir[i][k]=(kir[i][k]-p*kir[j][k]+mod)%mod;
swap(kir[i],kir[j]);
ans=-ans;
}
ans=(ans*kir[i][i])%mod;
}
return (ans+mod)%mod;
}
char c;
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>c;
if(c=='.') mp[i][j]=++cnt;
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(mp[i][j])
for(int d=0;d<4;d++) {
const int nx=i+dx[d],ny=j+dy[d];
if(mp[nx][ny]) add(mp[i][j],mp[nx][ny]);
}
}
}
/*
for(int i=1;i<=cnt;i++) {
for(int j=1;j<=cnt;j++) printf("%d ",kir[i][j]);
printf("\n");
}
*/
cout<<gauss();
}

luogu 3790 文艺数学题

求无向图的所有生成树的权值gcd之和。

枚举所有gcd的值,然后反演一下。luogu的题解写的很清楚。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int mod=1000000007;
const int N = 1000005;
int ph[N],prime[N],cnt;
bool vis[N];
void phi() {
ph[1]=1;
for(int i=2; i<=N-5; i++) {
if(!vis[i]) {
prime[++cnt]=i;
ph[i]=i-1;
}
for(int j=1; j<=cnt; j++) {
if(i*prime[j]<=N-5) {
vis[i*prime[j]]=1;
}
else break;
if(i%prime[j]==0){
ph[i*prime[j]]=ph[i]*prime[j];break;
}
else ph[i*prime[j]]=ph[i]*ph[prime[j]];
}
}
}
int ksm(int d,int z) {
int res=1;
while(z) {
if(z&1) res=(1ll*res*d)%mod;
d=(1ll*d*d)%mod;
z>>=1;
}
return res;
}
int top,st[3605],ed[3605],val[3605],kir[65][65],n,m,mx;
int bark[10000005],fa[65];
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
inline int gauss() {
for(int i=0;i<n;i++)for(int j=0;j<n;j++) kir[i][j]=(kir[i][j]+mod)%mod;
int ans=1,f=1;
for(int i=1;i<n;i++) {
int p=i;
for(;!kir[p][i]&&p<n;p++);
if(p!=i) f=-f,swap(kir[p],kir[i]);
if(!kir[i][i]) return 0;
ans=1ll*ans*kir[i][i]%mod;
int inv=ksm(kir[i][i],mod-2);
for(int j=i+1;j<n;j++) {
if(!kir[j][i]) continue;
int tp=1ll*kir[j][i]*inv%mod;
for(int k=1;k<n;k++) kir[j][k]=(kir[j][k]-1ll*kir[i][k]*tp%mod+mod)%mod;
}
}
return (ans*f%mod+mod)%mod;
}
int main() {
phi();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d%d",&st[i],&ed[i],&val[i]),st[i]--,ed[i]--;
for(int i=1;i<=m;i++) {
for(int j=1;j*j<=val[i];j++) {
if(val[i]%j==0) {
bark[j]++;
if(j*j!=val[i]) bark[val[i]/j]++;
}
}
}
long long ans=0;
for(int i=1;i<=1000000;i++) {
if(bark[i]<n-1) continue;
int cnt=0;
for(int j=0;j<=n;j++) fa[j]=j;
memset(kir,0,sizeof kir);
for(int j=1;j<=m;j++) {
if(val[j]%i==0) {
if(find(st[j])!=find(ed[j]))
cnt++,fa[find(st[j])]=fa[find(ed[j])];
if(st[j]!=ed[j])
kir[st[j]][st[j]]++,kir[ed[j]][ed[j]]++,kir[st[j]][ed[j]]--,kir[ed[j]][st[j]]--;
}
}
if(cnt==n-1) ans=(ans+1ll*ph[i]*gauss())%mod;
}
printf("%lld",ans);
return 0;
}

[模板]Matrix Tree定理的更多相关文章

  1. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

  2. @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列

    目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...

  3. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  4. [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  5. 【证明与推广与背诵】Matrix Tree定理和一些推广

    [背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...

  6. 数学-Matrix Tree定理证明

    老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...

  7. HDU 4305 Lightning Matrix Tree定理

    题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...

  8. BZOJ.4894.天赋(Matrix Tree定理 辗转相除)

    题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...

  9. BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)

    题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...

随机推荐

  1. owin-startup方法

    owin在根目录下有这个startup.cs文件,里面有个startup方法,这个和global.asax有什么区别呢? 测试一下执行顺序,是先执行了global.asax文件,再执行了startup ...

  2. error at ::0 can't find referenced pointcut...解决方法

    error at ::0 can't find referenced pointcut...解决方法 学习了:http://dyldragon.iteye.com/blog/512612 升级aspe ...

  3. Unix(AIX) set命令

    Unix(AIX) set命令,set命令是shell所具有的,不仅仅是aix自己有的: set -o vi  可以用vi方式操作,用来获取已经输入过的命令: 如果希望自动设置,可以在.profile ...

  4. Android View系统解析(下)

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/38426471(来自singwhatiwanna的csdn博客) Androi ...

  5. 36岁IT老人再次随笔——程序员的门槛其实并不高,但却是一个易学难精的行当——IT的快车很快,我常看到不少人摔落下去,但又有不少身手敏捷的人跳了上来 good

    36岁的我,还在IT里面留恋着技术.我不是什么技术牛人,只是不愿离开.搞硬件的朋友对我说:“我以为你是搞硬件的,没想到你软件方面这么厉害?”,搞软件的朋友对我说:“我以为你只是搞软件的,没想到你硬件方 ...

  6. POJ - 3280Cheapest Palindrome-经典区间DP

    POJ - 3280 Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & ...

  7. Spring整合JUnit4测试使用注解引入多个配置文件

    转自:https://kanpiaoxue.iteye.com/blog/2151903 我们使用spring写junit单测的时候,有的时候我们的spring配置文件只有一个.我们在类的注释上面会这 ...

  8. springsecurity+jwt实践和学习

    1.参考资料: https://blog.csdn.net/qq924862077/article/details/83038031 https://blog.csdn.net/sxdtzhaoxin ...

  9. MVC学习日记(三)EntityFramework

    其实学会了第一篇的创建和第二篇的使用以后,基本的mvc操作足够了,至于验证神马的,还不如用Jquery.h5的好看适用,所以接下来, 后续上会讲一些比较实用的. 在之前的文章说到了基础的使用, 那么, ...

  10. layui新手使用

    1,首先最重要的是引入官方的layui.js  layui.css文件 2,在自己的项目中新建一个目录 再在该目录下建一个js文件,js中写入 layui.define(['layer', 'form ...