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


    题目: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 定理

  • 相关阅读:
    shell脚本模拟交互操作实现上传文件至sftp
    从文件A中去除掉文件B的内容
    Linux批量kill某个程序的进程
    单数据盘或者很多数据盘mount挂载到某个目录
    用户HTTP请求过程简单剖析
    linux服务器系统盘坏且系统盘为软raid的修复方法
    linux系统运行状态检查
    TCP的三次握手和四次挥手
    ES6嵌套对象的解构
    DRF框架在嵌套关系下实现嵌套对象字段的过滤
  • 原文地址:https://www.cnblogs.com/wmrv587/p/4307791.html
Copyright © 2020-2023  润新知