基尔霍夫矩阵 https://blog.csdn.net/w4149/article/details/77387045 https://blog.csdn.net/qq_29963431/article/details/51236064 题目链接  https://vjudge.net/problem/SPOJ-HIGH AC代码 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi firs…
HIGH - 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 ci…
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3928  Solved: 2154[Submit][Status][Discuss] Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯…
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Status][Discuss] Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有…
定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即: 3.对于矩阵C而言,C表示两点之间是否存在边,当i==j时为一点无边可言为0,即: 4.定义基尔霍夫矩阵J为度数矩阵D-邻接矩阵C,即J=D-C; 5.G图生成树的数量为任意矩阵J的N-1阶主子式的行列式的绝对值. 证明: 伪证明,不是证明基尔霍夫定理,而是讲一下原理,证明超过我们所需要使用的范…
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示: N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示: 现给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 计算出的不同的n轮状病毒数输出. Sample I…
基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 15125 39601  103680  271441    710645      1860496 第1.3.5.7...[奇数位]位是平方数 : 1*1  4*4  11*11   29*29   76*76   199*199  521*521... 第2.4.6.8...[偶数位]位除以5后也是平…
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个…
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Status] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source 基尔霍夫矩阵总算编出来了,这道题考…
BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同…
网上说的是什么基尔霍夫矩阵,没学过这个,打个表找下规律,发现 w[i]=3*w[i-1]-w[i-2]+2; 然后写个高精直接递推就行了 //By BLADEVIL var n :longint; a, b, c :..] of longint; w :..] of ansistring; i :longint; function plus(s1,s2:ansistring):ansistring; var len :longint; i :longint; s :ansistring; beg…
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input…
1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵????OTZ... 什么叫基尔霍夫矩阵就自己去学吧,博主太菜也不会啊... 总之答案就是递归出来的:F(n)=3*F(n-1)-F(n-2)+2 在码个高精度就莫名其妙的A了...真的是毒瘤... 代码: #include<cstdio> #include<cstring> #inclu…
题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; ; typedef long long…
题目描述 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 解法 一开始看到这道题以为是组合数,求\(C^{n-1}_{n+1}\),但是在这个图上可能会出现环,我们需要保证所有的答案都是能够联通所有的点,那么就不能这样做. 那么我们就打一…
题解:http://vfleaking.blog.163.com/blog/static/17480763420119685112649/ #include <iostream> #include <cstdio> using namespace std; struct data{int a[101],len;}; data mul(data a,int k){ for(int i=1;i<=a.len;i++)a.a[i]*=k; for(int i=1;i<=a.l…
题目描述 为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 判断两棵树是否同构的伪代码如下: 题解 样例\(1\)是这个意思 我们需要解出两部分的答案,\(f(n)\)表示\(i\)个节点的树的个数,这个就是经典的卡特兰数为了方便计算我们将通项公式写成\(f(n)=\frac{C^n_(2n)}{n+1}\)的形式. 我们在定义\(g(n)\)表示\(i\)个节点中所有形态的…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的…
[BZOJ1494][NOI2007]生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为n. ·n个结点的完全图的生成树个数为n^(n-2).这两个发现让小栋欣喜若狂,由此更加坚定了他继续计算生成树个数的 想法,他要计算出各种各样图的生成树数目.一天,小栋和同学聚会,大家围坐在一张大圆桌周围.小栋看了看, 马上想到了生成树问题.如果把每个同学看成一个结点,邻座(结点间距离为1)的同学间…
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part - 4@ @2 - 一些简单的推广@ @3 - 例题与应用@ @4 - prüfer 序列@ @0 - 参考资料@ MoebiusMeow 的讲解(超喜欢这个博主的!) 网上找的另外一篇讲解 @0.5 - 你所需要了解的线性代数知识@ 什么是矩阵? 什么是高斯消元?这个虽然与主题无关,但是求解行列…
题目链接:https://vjudge.net/problem/SPOJ-HIGH 解法: 生成树计数 1.构造 基尔霍夫矩阵(又叫拉普拉斯矩阵) n阶矩阵 若u.v之间有边相连 C[u][v]=C[v][u]=-1 矩阵对角线为点的度数 2.求n-1阶主子式 的行列式的绝对值 去掉第一行第一列 初等变换消成上三角矩阵 对角线乘积为行列式 #include <bits/stdc++.h> using namespace std; const double eps = 1e-8; const i…
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只有一条路径. \(Solution\) 生成树计数 直接上Matrix Tree 无解情况别忘了判 MatrixTree定理大体见这吧,证明别的应用什么的先不管了. 基尔霍夫矩阵=度数矩阵-边矩阵. #include <cmath> #include <cstdio> #include…
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1766  Solved: 946[Submit][Status] Description  给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT   Source 分析:从图中可以很容易看出,答…
本篇口胡写给我自己这样的什么都乱证一通的口胡选手 以及那些刚学Matrix-Tree,大致理解了常见的证明但还想看看有什么简单拓展的人- 大概讲一下我自己对Matrix-Tree定理的一些理解.常见版本的证明.我自己的证明,以及简单的一些应用(比如推广到有向图.推广到生成树边权的乘积和什么的,非常基础). 应该看到这里的人都知道Matrix-Tree定理是干什么的吧-就是统计一个无向图的生成树个数,表示成一个行列式. 1.前置定义及性质 首先是Matrix-Tree定理相关的定义:对于一个无向图…
此类题是给定一个无向图,求所有生成树的个数,生成树计数要用到Matrix-Tree定理(Kirchhoff矩阵-树定理) G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0:当i=j时,dij等于vi的度数 G的邻接矩阵A[G]也是一个n*n的矩阵, 并且满足:如果vi.vj之间有边直接相连,则aij=1,否则为0 我们定义G的Kirchhoff矩阵(也称为拉普拉斯算子)C[G]为C[G]=D[G]-A[G],则Matrix-Tree定理可以描述为:G的所有不同的生成树的个…
Luogu P5296 [北京省选集训2019]生成树计数 题目链接 题目大意:给定每条边的边权.一颗生成树的权值为边权和的\(k\)次方.求出所有生成树的权值和. 我们列出答案的式子: 设\(E\)为我们枚举的生成树的边集. \[ Ans=\sum_{E}(\sum_{i\in E}w_i)^k\\ =\sum_E \prod_{i\in E} \binom{k}{a_i}w_i^{a_i}[\sum_{i\in E}a_i=k]\\ =\sum_E \frac{1}{k!} \prod_{i…
这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了. 用高精度?有分数出现. 用辗转相除的思想,让它不出现分数.但过程中会出现负数,高精度处理负数太麻烦. 用Python打表?好吧,Python还不熟,写不出来..... 所以,如果这道题我考场上遇到,最多用double骗到n<=20的情况的部分分. 最终只能求助于题解了... 好像是通过观察行列式的特点,推导出关于答案f(n)的递推式(f(n)=…
题意:给定一个公司的人数,然后还有一个boss,然后再给定一些人,他们不能成为直属上下级关系,问你有多少种安排方式(树). 析:就是一个生成树计数,由于有些人不能成为上下级关系,也就是说他们之间没有边,没说的就是有边,用Matrix-Tree定理,很容易就能得到答案,注意题目给定的可能有重复的. 对于基尔霍夫矩阵,就是度数矩阵,减去邻接矩阵,一处理就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #i…
Organising the Organisation 题目链接:https://vjudge.net/problem/UVA-10766 Description: I am the chief of the Personnel Division of a moderate-sized company that wishes to remain anonymous, and I am currently facing a small problem for which I need a skil…
这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... 找到一个写的特别详细的. il int det() { ; ; i <= sz; ++i) { // 当前在消第i个(i,i) , t; j <= sz; ++j) { // 把它下面对应的位置消成0 while (m[j][i]) { // 直到为0 t = m[i][i] / m[j][i]…