zoukankan      html  css  js  c++  java
  • 三元环&四元环计数

    三元环计数

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

    做法

    将图中的所有边按照度数由大向小定向变成有向图,然后枚举一个点 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 要先枚举无向边,然后再枚举有向边即可

  • 相关阅读:
    iOS添加Google语言识别功能
    转载:Ajax中get与post请求详解
    SSH:Spring+Spring MVC+hibernate整合开发笔记
    IDEA中创建maven web项目的详细部署步骤
    C++实现RTMP协议发送H.264编码及AAC编码的音视频
    C++ 勘误
    Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库
    .Net NPOI 上传excel文件、提交后台获取excel里的数据
    .Net NPOI 根据excel模板导出excel、直接生成excel
    .Net 登陆的时候添加验证码
  • 原文地址:https://www.cnblogs.com/Hs-black/p/13095748.html
Copyright © 2011-2022 走看看