zoukankan      html  css  js  c++  java
  • [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 定理

  • 相关阅读:
    全文检索引擎 sphinxcoreseek中文索引
    html 截图粘粘图片JS
    php 无限参数方法
    LINUX SSH 建立密钥对
    PHP递归无限分类,数组和直接输出。
    带cookie请求数据
    JS 红包随机
    《大话数据结构》 第四章 栈与队列
    《大话数据结构》第二章 算法
    《大话设计模式》 第二章 策略模式
  • 原文地址:https://www.cnblogs.com/wmrv587/p/4307791.html
Copyright © 2011-2022 走看看