zoukankan      html  css  js  c++  java
  • 图论分块

    在图论中,常常有这么一类问题,(n) 个点 (m) 条边的无向图,每次可以修改一个结点的信息,每次询问一个点邻接到的所有点的信息之和,(n)(m) 以及询问数 (q) 均在 (10^5) 这个级别。

    如果直接去模拟,如果数据频繁地询问一个度数非常大的结点,显然将会 TLE。对于这种题目,有一种常用的做法是图论分块,使用了均摊复杂度的思想,时间复杂度可以达到 (O(qsqrt m))。有时图论分块还会套数据结构。

    设有一张 (n) 个点 (m) 条边的无向图,不妨设度数小于等于 (sqrt {2m}) 的点为轻点,度数大于 (sqrt {2m}) 的点为重点,那么有以下结论:
    一个轻点只与不超过 (sqrt {2m}) 个点相邻,一个重点只与不超过 (sqrt {2m}) 个重点相邻。

    证明:假设重点 (u) 和多于 (sqrt {2m}) 个重点相邻,那么和 (u) 相邻的重点度数之和将大于 (sqrt {2m} imes sqrt {2m}=2m),由握手定理,(m) 条边的无向图度数为 (2m),矛盾。所以一个重点只与不超过 (sqrt {2m}) 个重点相邻。

    有些博客是按 (sqrt m) 划分轻重点,然后说一个重点只与不超过 (sqrt m) 个重点相邻,这是错的,应该指明在渐进意义下。

    那么轻点同时向相邻的轻点和重点连有向边,重点只向相邻的重点连有向边。那么每更新一个轻点,同时要维护这个轻点邻接到的所有点的信息;每更新一个重点,只维护它邻接到的重点的信息。如果询问一个重点,那么直接输出这个重点的信息;如果询问一个轻点,因为重点不会去更新轻点,所以需要暴力遍历和它相邻的所有点,计算出答案。如果修改一个点的时间复杂度是 (O(1))的,那么这样单次操作的时间复杂度是 (O(sqrt m))(q) 次操作的时间复杂度为 (O(qsqrt m))

  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/AEMShana/p/13621787.html
Copyright © 2011-2022 走看看