luoguP4208 [JSOI2008]最小生成树计数 矩阵树定理
题目大意:
求最小生成树的数量
曾今的我感觉这题十分的不可做
然而今天看了看,好像是个类模板的题....
我们十分容易知道,记能出现在最小生成树中的边的集合为\(S\)
那么,只要是\(S\)中的边构成的树,一定能构成最小生成树
我们只要预处理哪些可能在最小生成树中即可
打个树剖维护以下就可以了
太懒了,不想打太长,然后就拿并查集随便弄了弄
最后来个矩阵树就行了
\(31011\)不是一个质数,用辗转相除法来消元
复杂度\(O(n^3 \log n)\)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
const int sid = 105;
const int mod = 31011;
inline void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; }
inline void dec(int &a, int b) { a -= b; if(a < 0) a += mod; }
inline int mul(int a, int b) { return 1ll * a * b % mod; }
int n, m, fa[sid];
int E[sid][sid];
struct edge {
int u, v, w;
friend bool operator < (edge a, edge b)
{ return a.w < b.w; }
} e[sid * 10];
inline int find(int o) {
if(o == fa[o]) return o;
else return fa[o] = find(fa[o]);
}
inline void init() {
sort(e + 1, e + m + 1);
rep(i, 1, n) fa[i] = i;
for(ri i = 1, j; i <= m; i = j + 1) {
j = i;
while(e[j].w == e[i].w) j ++; j --;
rep(k, i, j) {
int u = find(e[k].u), v = find(e[k].v);
if(u == v) continue;
inc(E[u][u], 1); inc(E[v][v], 1);
inc(E[u][v], mod - 1); inc(E[v][u], mod - 1);
}
rep(k, i, j) {
int u = find(e[k].u), v = find(e[k].v);
if(u == v) continue; fa[u] = v;
}
}
}
inline void calc() {
int sign = 1;
n --;
rep(i, 1, n) rep(j, i + 1, n)
while(E[j][i]) {
int t = E[i][i] / E[j][i];
rep(k, i, n) dec(E[i][k], mul(t, E[j][k]));
swap(E[j], E[i]);
sign *= -1;
}
int ans = 1;
rep(i, 1, n) ans = mul(ans, E[i][i]);
if(sign == 1) printf("%d\n", ans);
else printf("%d\n", mod - ans);
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i ++)
cin >> e[i].u >> e[i].v >> e[i].w;
init(); calc();
return 0;
}
luoguP4208 [JSOI2008]最小生成树计数 矩阵树定理的更多相关文章
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
- spoj104 highways 生成树计数(矩阵树定理)
https://blog.csdn.net/zhaoruixiang1111/article/details/79185927 为了学一个矩阵树定理 从行列式开始学(就当提前学线代了.. 论文生成树的 ...
- 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理
蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...
- BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...
- uva10766生成树计数(矩阵树定理)
更正了我之前打错的地方,有边的话G[i][j]=-1; WA了好多次,中间要转成long double才行..这个晚点更新. #include<cstdio> #include<cs ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- bzoj1016 [JSOI2008]最小生成树计数——Kruskal+矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 从 Kruskal 算法的过程来考虑产生多种方案的原因,就是边权相同的边有一样的功能, ...
- BZOJ 1016 最小生成树计数(矩阵树定理)
我们把边从小到大排序,然后依次插入一种权值的边,然后把每一个联通块合并. 然后当一次插入的边不止一条时做矩阵树定理就行了.算出有多少种生成树就行了. 剩下的交给乘法原理. 实现一不小心就会让程序变得很 ...
- 【Matrix-tree定理】【并查集】【kruscal算法】bzoj1016 [JSOI2008]最小生成树计数
题意:求一个图的最小生成树个数. 矩阵树定理:一张无向图的生成树个数 = (度数矩阵 - 邻接矩阵)的任意一个n-1主子式的值. 度数矩阵除了对角线上D[i][i]为i的度数(不计自环)外,其他位置是 ...
随机推荐
- OpenCV LIBTIFF_4.0 link errors
以前用Caffe用的好好的,今天重装后居然报了很多这样的错误 /usr/lib/libopencv_highgui.so.' 1> /usr/lib/libopencv_highgui.so.' ...
- aarch64_g1
GAPDoc-1.5.1-12.fc26.noarch.rpm 2017-02-14 07:37 1.0M fedora Mirroring Project GAPDoc-latex-1.5.1-12 ...
- 微信web开发者工具无法打开的解决方法
参考网址:https://blog.csdn.net/gz506840597/article/details/77915488 我试了上面兄弟说的方法还是无效 下面说说我的方法: 我打开文件所在位置, ...
- 自定义ProgressBar的加载效果
三种方式实现自定义圆形页面加载中效果的进度条 To get a ProgressBar in the default theme that is to be used on white/light b ...
- jexus linux x64[标准版] - 未集成mono 配置https
一.找到mono安装位置 sudo find / -name mono 二.首先查看“/lib”或“/usr/lib”等系统库文件夹中是否有SSL库文件的名字,该文件名应该是“libssl.so.版本 ...
- java基础35 双例集合Map及其常用方法
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- (一)问候 Log4j 你好
第一节: Log4j 简介 Log4j -------- log for java(java的日志) 是java主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务: 在爬虫领域,主要用 ...
- R语言学习笔记:使用reshape2包实现整合与重构
R语言中提供了许多用来整合和重塑数据的强大方法. 整合 aggregate 重塑 reshape 在整合数据时,往往将多组观测值替换为根据这些观测计算的描述统计量. 在重塑数据时,则会通过修改数据的结 ...
- python中round(四舍五入)的坑
python中的round函数不能直接拿来四舍五入,一种替代方式是使用Decimal.quantize()函数. 具体内容待补. >>> round(2.675, 2) 2.67 可 ...
- MEF实现设计上的“松耦合”(二)
介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能不限于此,比如MEF的目录服务.目录筛选.重组部件等高级应用在这里就不做过多讲解,因为博主觉得这些用法只有在某些特定的环 ...