• 图论分块


    在图论中,常常有这么一类问题,(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))

  • 相关阅读:
    C#获取根目录的方法集合
    C# 获取文件MD5值的方法
    VS2015 搭建 Asp.net core 开发环境
    【Networking】容器网络大观 && SDN 资料汇总
    【Networking】flannel,pipework,weave,udp,vxlan,ovs等资料
    【K8s】Kubernetes 最近正在看的资料
    【GoLang】go 微服务框架 && Web框架学习资料
    【Eclipse】eclipse che 协作开发
    【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
    【SpringBoot】SpringBoot 入门示例
  • 原文地址:https://www.cnblogs.com/AEMShana/p/13621787.html
Copyright © 2020-2023  润新知