码迷,mamicode.com
首页 > Web开发 > 详细

[BZOJ1016][JSOI2008]最小生成树计数(结论题)

时间:2015-03-02 00:56:51      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1016

分析:

首先有个性质:如果边集E、E‘都可以表示一个图G的最小生成树(当然E和E’的元素个数肯定一样),那么某确定权值的边在E中出现的次数==在E‘中出现的次数

简单证明一下:

按照Kruskal算法的流程来想,首先我们知道Kruskal求一个最小生成树是正确的,那么不同的最小生成树会怎么产生呢?当然是Kruskal选择权值相同的边的顺序,很有可能选择权值相同边的顺序不同导致后面能选的边也不同。

那我们先考虑权值最小的一组边,不妨先把它们全部加入,然后把相关联的顶点作为新的连通块,然后把产生的环上的边删掉使得没有环,易得这个操作不会影响点的连通情况,而且在权值最小的边中加入多少条边进去也是固定的,因为如果少加一条边的,那么连通块数量肯定会变小的

我们把权值最小的边形成的连通块缩成点

再考虑权值第二小的一组边,那么问题又划归到了处理权值第一小的边。。

于是就证完了。。。。

那么一种方法就出来了:

1、先搞一下MST,确定一下某权值的边要取几条

2、因为题目说权值相同的边不会超过10条,于是暴力枚举取拿几条就行了

当然还有另一种方法

ans=(权值为a1的所有边组成的连通块的生成树个数)*(权值为a2的所有边组成的连通块的生成树个数)........

对于每个连通块生成树个数的计算,经典方法:Matrix Tree 定理

[BZOJ1016][JSOI2008]最小生成树计数(结论题)

标签:

原文地址:http://www.cnblogs.com/wmrv587/p/4307791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!