题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 从 Kruskal 算法的过程来考虑产生多种方案的原因,就是边权相同的边有一样的功能,从而带来了多种选择: 对于每一层次(边权相同)的边来说,它们最终会把图进一步连通: 所以在这一层之前缩好点,看看这一层连接出几个新连通块,对于每个连通块内部做矩阵树定理求生成树个数,再乘法原理乘起来即可: 注意高斯消元的矩阵不能直接用原图的点标号等,求行列式会出错: 疑惑:以及高斯消元 return…
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了. Input 第 一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数.每个节点用1~n的整数编号.接下来的m行,每行包含两个整数:a, b, c,表示节点…
qwq 这个题目真的是很好的一个题啊 qwq 其实一开始想这个题,肯定是无从下手. 首先,我们会发现,对于无向图的一个最小生成树来说,只有当存在一些边与内部的某些边权值相同的时候且能等效替代的时候,才会有多种最小生成树. 那我们不妨对于原图先随意求一个最小生成树,然后对于出现在最小生成树上的每个权值计算贡献. 我们每次删除所有该权值的边,然后把剩下的点能缩点的进行缩点(用并查集来维护) 然后,我们构造一个联通块的拉普拉斯矩阵.也就是说,加入所有的在图中的,权值为该值的边.然后我们只需要求能重新构…
1016: [JSOI2008]最小生成树计数 题目:传送门 题解: 神题神题%%% 据说最小生成树有两个神奇的定理: 1.权值相等的边在不同方案数中边数相等  就是说如果一种方案中权值为1的边有n条    那么在另一种方案中权值为1的边也一定有n条 2.如果边权为1的边连接的点是x1,x2,x3   那么另一种方案中边权为1的边连接的也一定是x1,x2,x3  如果知道了这两条定理那就很好做了啊: 因为等权边的条数一定,那么我们就可以预处理求出不同边权的边的条数 题目很人道的保证了边权相同的边…
我们把边从小到大排序,然后依次插入一种权值的边,然后把每一个联通块合并. 然后当一次插入的边不止一条时做矩阵树定理就行了.算出有多少种生成树就行了. 剩下的交给乘法原理. 实现一不小心就会让程序变得很丑 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define int…
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了. Input 第一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数.每个节点用1~n的整数编号.接下来的m行,每行包含两个整数:a, b, c,表示节点a…
题意:求一个图的最小生成树个数. 矩阵树定理:一张无向图的生成树个数 = (度数矩阵 - 邻接矩阵)的任意一个n-1主子式的值. 度数矩阵除了对角线上D[i][i]为i的度数(不计自环)外,其他位置是0. 邻接矩阵G[i][j]的值为i与j之间的边数(重边要记入). 一个定理:一个图的所有MST中,相同权值的边数肯定是相等的. 于是将边从小到大排序之后,根据权值划分阶段,将之前的点全缩点,这一阶段的边中仅考虑当前权值的边,然后把图划分成多个连通块,对每个连通块使用矩阵树定理求生成树个数,该阶段的…
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3517  Solved: 1396[Submit][Status][Discuss] Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的…
传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形成的连通块状态是一样的 那么可以根据乘法原理按权值分步,将每一步得到的结果相乘. 每次分步的计算可以用搜索/矩阵树定理来实现. 代码: #include<bits/stdc++.h> #define mod 31011 #define N 15 #define M 1005 using names…
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace s…