• 三元环&四元环计数


    三元环计数

    求出无向图三元环和四元环的个数

    做法

    将图中的所有边按照度数由大向小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v 并标记,再枚举 v 的出边到的点 w,如果也有标记则表示找到了一个三元环,时间复杂度为 (Theta(msqrt m)),很容易证明一个三元环只会被枚举一次

    三元环

    时间复杂度证明

    网上有好多证明都是错的,搞了半天才搞懂

    以下分析不带常数,比如用 (sqrt m) 代替 (sqrt {2m})

    考虑每个点对答案的贡献,即有若干条入边枚举到它,然后再枚举它的所有出边,也就是 (in_x*out_x),由于是度数从大向小连的边,所以 (in_x le sqrt m),为什么呢,考虑如果 (in_x > sqrt m),那么它有至少 (sqrt m) 条边,而连向它的点的度数都大于它的度数,而最多只可能有 (sqrt m) 个度数大于 (sqrt m) 的点,所以矛盾。因此总时间复杂度是 (Theta(sqrt m*m)=Theta(msqrt m))

    同理如果从度数小的连向度数大的,那么 (out_x le sqrt m),读者可自证

    四元环计数

    做法

    与三元环有些区别在于这里既要用到定向后的有向边,也要用到没有定向的无向边

    下文无向边指原图中的边,出边和入边指有向图的边

    将图中所有的边按度数由大到小定向变成有向图,然后枚举一个点 u 和它的所有出边到的点 v ,然后枚举 v 的无向边到的点 w,其中要求 w 的度数要小于 u,时间复杂度仍然为 (Theta(msqrt m)),每个四元环只会在其最小度数点的位置被统计一次

    四元环

    时间复杂度证明

    仍然考虑一个点对复杂度的贡献,首先它被 (in_x) 条边枚举到,然后遍历它所有的 (deg_x) 条无向边,也就是 (in_x * deg_x),同三元环的证明,(in_x) 不会超过 (sqrt m),复杂度得证

    那么从小向大连当然也是可以的,但 u 要先枚举无向边,然后再枚举有向边即可

  • 相关阅读:
    C++编程练习(3)----“实现简单的栈的顺序存储结构“
    C++编程练习(2)----“实现简单的线性表的链式存储结构“
    C++编程练习(1)----“实现简单的线性表的顺序存储结构“
    Django--登录实例
    Django--model模型绑定_数据库操作
    Django--初始化
    web框架--MVC、MTV
    CSS--箭头
    CSS--抽屉(dig.chouti.com)页面
    jQuery--加一行减一行
  • 原文地址:https://www.cnblogs.com/Hs-black/p/13095748.html
Copyright © 2020-2023  润新知