现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。
| 题目名称 | 1854. [JSOI 2008] 最小生成树计数 | 
|---|---|
| 输入输出 | bzoj_1016.in/out | 
| 难度等级 | ★★★☆ | 
| 时间限制 | 1000 ms (1 s) | 
| 内存限制 | 162 MiB | 
| 测试数据 | 10 | 
| 题目来源 |  | 
| 开放分组 | 全部用户 | 
| 提交状态 | |
| 分类标签 | |
| 分享题解 | 
| 通过:78, 提交:217, 通过率:35.94% | ||||
|  | 100 | 0.000 s | 0.00 MiB | C++ | 
|  | 100 | 0.000 s | 0.00 MiB | C++ | 
|  | 100 | 0.003 s | 0.32 MiB | C++ | 
|  | 100 | 0.003 s | 0.33 MiB | C++ | 
|  | 100 | 0.003 s | 0.34 MiB | C++ | 
|  | 100 | 0.003 s | 0.36 MiB | C++ | 
|  | 100 | 0.003 s | 0.41 MiB | C++ | 
|  | 100 | 0.003 s | 0.56 MiB | C++ | 
|  | 100 | 0.003 s | 2.79 MiB | C++ | 
|  | 100 | 0.004 s | 0.31 MiB | C++ | 
| 关于 最小生成树计数 的近10条评论(全部评论) | ||||
|---|---|---|---|---|
| 
这题不需要Matrix-Tree直接暴力+Kruskal就可以了 | ||||
| 
回复 @Asm.Def : 神犇提醒的对,我在这几个地方也都错了- - | ||||
| 
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