现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。
题目名称 | 1854. [JSOI 2008] 最小生成树计数 |
---|---|
输入输出 | bzoj_1016.in/out |
难度等级 | ★★★☆ |
时间限制 | 1000 ms (1 s) |
内存限制 | 162 MiB |
测试数据 | 10 |
题目来源 | Asm.Def 于2014-12-07加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:78, 提交:217, 通过率:35.94% | ||||
Marvolo | 100 | 0.000 s | 0.00 MiB | C++ |
BaDBoY | 100 | 0.000 s | 0.00 MiB | C++ |
Hellc | 100 | 0.003 s | 0.32 MiB | C++ |
小强 | 100 | 0.003 s | 0.33 MiB | C++ |
Owen | 100 | 0.003 s | 0.34 MiB | C++ |
Nawox | 100 | 0.003 s | 0.36 MiB | C++ |
stone | 100 | 0.003 s | 0.41 MiB | C++ |
sxysxy | 100 | 0.003 s | 0.56 MiB | C++ |
swm_sxt | 100 | 0.003 s | 2.79 MiB | C++ |
Kirin | 100 | 0.004 s | 0.31 MiB | C++ |
关于 最小生成树计数 的近10条评论(全部评论) | ||||
---|---|---|---|---|
这题不需要Matrix-Tree直接暴力+Kruskal就可以了
| ||||
回复 @Asm.Def :
神犇提醒的对,我在这几个地方也都错了- - | ||||
HouJikan
2015-01-16 13:40
7楼
| ||||
回复 @HouJikan :
如果你用一个指针数组存矩阵的话swap的时候只要交换两行的指针就可以了…… | ||||
QAQ代码写的跟屎一般。。
BZOJ上还会超时QAQ 到时候重写 | ||||
附上最小生成树的两个性质:
1、边权相等的边的个数一定。 2、做完边权为w的所有边时,图的连通性相同。 | ||||
暴搜,童鞋们一定不要在存下下标的时候来遍sort啊,还有如果是跟我一样的离散化,注意离散排序的数组是Maxm,不是Maxn
| ||||
几天来写出的代码共找到bug如下:
1.忽略了31011是个合数,利用高斯消元求行列式时求了个逆元; 2.没有判断无解的情况(最终不连通); 3.没有考虑“相同权值的边形成的不是一个联通块”的情况; 4.应用Matrix-Tree定理前对缩点后的图构造Kirchhoff矩阵时重边两侧的“连通度”仍为1。 真是醉醉醉醉醉…… | ||||
我要学静态查错!!!!!
|
现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。
第一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数。每个节点用1~n的整数编号。接下来的m行,每行包含两个整数:a, b, c,表示节点a, b之间的边的权值为c,其中1<=c<=1,000,000,000。数据保证不会出现自回边和重边。注意:具有相同权值的边不会超过10条。
输出不同的最小生成树有多少个。你只需要输出数量对31011的模就可以了。
4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1
8