zoukankan      html  css  js  c++  java
  • 三元环 & 四元环计数 学习笔记

    考虑对一个无向图数三元环 / 四元环(注意,环是一个边集而非点集,在四元环中将体现两者的区别)。

    这两个算法基于以下神仙操作(不知道发明者是怎么想到的?):重定向每条边,规则是按度数为第一关键字点号为第二关键字排序后(第二关键字的存在仅是为了使严格比较总能进行),小的连向大的。显然这是一张 DAG。这样一个特殊的重定向方式使得以下优美性质成立:新图中每个点的出度为 (mathrm O(sqrt m))

    证明:对原图中度数 (leq sqrt m) 的显然;对 (>sqrt m) 的,根据排序方式可知,它在新图中连出的点在原图中的度数都 (>sqrt m),这样的点数是 (mathrm O(sqrt m))。不难发现这个证明使用了根分的思想。

    一个小推论:(A o B o C)(Agets B o C) 的数量都是 (mathrm O(msqrt m))(在现实中非常不满),对 (B o C) 进行度数分析,再乘上 (sumlimits_B cnt_A) 即可得到。


    下面讲两个算法。(五元环及以上计数听说不可做?)

    三元环计数

    显然,原无向图中的三元环在新 DAG 中的边向情况只可能是 (A o B,B o C,A o C)。那么如果数 (A o B o C) 显然是不重不漏的。于是枚举这样的东西,然后判 (A o C) 是否有边即可,复杂度 (mathrm O(msqrt m))(三元环计数算法能枚举到每个三元环,这从侧面说明了三元环数量就是 (mathrm O(msqrt m)))。但是对 (n^2) 无法承受的数据范围,(mathrm O(1)) 判边的存在性是无法做到的。在三元环计数里,这很好解决,只需要对每个 (A) 标记一波出点,然后等所有 (A) 开头的这个三元链都枚举完之后撤销标记即可。

    mol ban tea code

    四元环计数

    随便枚举一下(大概可以通过枚举每个点的度数来粗糙分析?)得到边向情况有三种:

    1. (A o B,B o C,A o D,D o C)
    2. (A o B,B o C,Agets D,D o C)
    3. (Agets B,B o C,Agets D,D o C)

    根据我列的方式就可以看出来,设 (? o? o?) 是 A1,(?gets? o?) 是 A2,那么就是 A1 * 2, A1 + A2, A2 * 2 这三种。

    第一种中,(A) 显然是 unique 的,于是枚举 (A) 可以不重不漏。于是就枚举 (A),然后枚举一下 (A) 开头的 A1,数量为 (cnt),贡献就是 (dbinom{cnt}2)

    第二种中,(A) 显然是 unique 的,于是枚举 (A) 可以不重不漏。于是就枚举 (A),然后枚举一下 (A) 开头的 A1, A2,数量为 (cnt1,cnt2),贡献就是 (cnt1 imes cnt2)

    第三种中,(A,C) 具有同等地位,直接枚举 (A) 的话每个会被算两遍,最终除以二即可。于是就枚举 (A),然后枚举一下 (A) 开头的 A2,数量为 (cnt),贡献就是 (dbinom{cnt}2)

    综上,要做的就是枚举每个点,然后枚举这个点开头的 A1 和 A2,复杂度 (mathrm O(msqrt m))

    代码 gym102028L 的题解里有。

    珍爱生命,远离抄袭!
  • 相关阅读:
    .netcore返回HellowWorld四种方式(管道配置,管道扩展方法,中间件,IStartupFilter 使用中间件的升级扩展)
    Mysql分页大数据量查询优化
    swagger发布本地的调试的时候没事,发布服务器提示500 : {"Message":"出现错误。"}
    DBeaver的使用(impala和数据库)
    mysql远程连接问题
    java+thymeleaf-layout-dialect+thymeleaf的使用
    springboot+thyemeleaf+swagger项目的创建和问题的解决
    ffmpeg实践
    Camera.main
    python双曲线拟合
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/ssyhjs0.html
Copyright © 2011-2022 走看看