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 的题解里有。

    珍爱生命,远离抄袭!
  • 相关阅读:
    Oracle中TO_DATE格式
    实现带查询功能的Combox控件
    Combox和DropDownList控件的区别
    C# 获取字符串中的数字
    C# try catch finally 执行
    树形DP codevs 1814 最长链
    codevs 2822 爱在心中
    匈牙利算法 cojs.tk 搭配飞行员
    匈牙利算法 codevs 2776 寻找代表元
    2016-6-19 动态规划,贪心算法练习
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/ssyhjs0.html
Copyright © 2011-2022 走看看