Thanks to i207M && iki9!


三元环计数

无向图的三元环计数

我们首先需要对无向边按一定规则定向:

设 \(in[u]\) 表示 \(u\) 的度数

  • 若 \(in[u]>in[v]\) ,从 \(u\) 向 \(v\) 连边,反之则从 \(v\) 向 \(u\) 连边。
  • 若 \(in[u]==in[v]\) ,我们从编号大的点向编号小的点连边。

此时这张图是一张有向无环图。

枚举每个点 \(u\) ,标记所有 \(u\) 的出点;然后枚举点 \(u\) 的出点 \(v\) ,再枚举 \(v\) 的出点 \(w\) ,若 \(w\) 被标记,则 \((u,v,w)\) 成三元环。

每个三元环只会在 \(u\) 被统计一次,如下图。

代码:

#define R register int
inline void main() {
n=g(),m=g();
for(R i=1,u,v;i<=m;++i) u=g(),v=g(),++d[u],++d[v],e[i]=edge(u,v);
for(R i=1,u,v;i<=m;++i) { u=e[i].u,v=e[i].v;
if(d[u]>d[v]||(d[u]==d[v]&&u>v) add(u,v);
else add(v,u);
} R ans=0;
for(R u=1;u<=n;++u) { ++C;
for(R i=fir[u];i;i=nxt[i]) flg[vr[i]]=C;
for(R i=fir[u];i;i=nxt[i])
for(R j=fir[vr[i]];j;j=nxt[j]) ans+=(flg[vr[j]]==C);
} printf("%d\n",ans);
}

时间复杂度:

有向完全图(竞赛图)的三元环计数

\(C(n,3)-\sum_{u} C(in_u,2)\) ,\(in_u\) 表示 \(u\) 的入度。


四元环计数

还是要对边定向,同样类似上边的定向。

但此时注意枚举点 \(u\) 相邻的点 \(v\) 是原图中的边(而非重定向后的边),而枚举 \(v\) 相邻的点 \(w\) 则要是重定向后的点(可以交换图的顺序),原因是我们相当于是枚举两个部分拼起来。

还是在 \(u\) 被枚举一次,因为 \(rk[u]<rk[w]\).

代码:

inline bool cmp(const int& _this,const int& _that)
{return d[_this]<d[_that]||(d[_this]==d[_that]&&_this<_that);}
#define con const int&
inline void main() {
n=g(),m=g(); for(R i=1,u,v;i<=m;++i)
u=g(),v=g(),e[u].push_back(v),e[v].push_back(u);
for(R i=1;i<=n;++i) d[id[i]=i]=e[i].size();
sort(id+1,id+n+1,cmp);
for(R i=1;i<=n;++i) rk[id[i]]=i;
for(R u=1;u<=n;++u) for(con v:e[u])
if(rk[v]>rk[u]) f[u].push_back(v);
for(R u=1;u<=n;++u) {
for(con v:e[u]) for(con w:f[v]) if(rk[w]>rk[u]) ans+=c[w],++c[w]; //交换e与f的枚举顺序也是对的。
for(con v:e[u]) for(con w:f[v]) if(rk[w]>rk[u]) c[w]=0; //清空桶。
} printf("%lld\n",ans);
}

时间复杂度同上。

还有一种别的写法:

const int N=510;
int n,m; ll ans; bitset <N> e[N];
inline void main() {
n=g(),m=g(); for(R i=1,u,v;i<=m;++i) u=g(),v=g(),e[u][v]=true,e[v][u]=true;
for(R i=1,tmp;i<=n;++i) for(R j=i+1;j<=n;++j) {
tmp=(e[i]&e[j]).count(); ans+=tmp*(tmp-1);
} printf("%lld\n",ans>>2);
}

\(\mathcal{O}(n^3/32)\)


2019.10.28

18

[笔记] 三元环 && 四元环计数的更多相关文章

  1. FJWC2019 子图 (三元环计数、四元环计数)

    给定 n 个点和 m 条边的一张图和一个值 k ,求图中边数为 k 的联通子图个数 mod 1e9+7. \(n \le 10^5, m \le 2 \times 10^5, 1 \le k \le ...

  2. Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环

    D. Dividing Kingdom II   Long time ago, there was a great kingdom and it was being ruled by The Grea ...

  3. hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序

    一:题目大意:   给你一个关系图,判断是否合法,    每个人都有师父和徒弟,可以有很多个:  不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...

  4. HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序

    题目大意: 给你一个关系图,判断是否合法.每个人都有师父和徒弟,可以有很多个: 若A是B的师父,B是C的师父,则A也算C的师父. 不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟 ...

  5. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  6. Windows系统调用中API从3环到0环(上)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(上) 如果对API在三 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  8. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  9. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文, ...

随机推荐

  1. mysql数据库语言分类

    MySQL的sql语言分类DML.DQL.DDL.DCL.   MySQL的sql语言分类DML.DQL.DDL.DCL. SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语 ...

  2. NOP法破解

    目录 步骤 步骤 OD载入目标软件,汇编窗口右键搜索字符串,发现错误类提示字符串,双击该字符串来到该段代码位置. 向上寻找到跳转到本段错误提示代码的跳转指令,用NOP指令填充跳转指令. 保存修改后的代 ...

  3. Student's Camp CodeForces - 708E (dp,前缀和优化)

    大意: $n$行$m$列砖, 白天左侧边界每块砖有$p$概率被摧毁, 晚上右侧边界有$p$概率被摧毁, 求最后上下边界连通的概率. 记${dp}_{i,l,r}$为遍历到第$t$行时, 第$t$行砖块 ...

  4. 第2章 NIO入门

    2.1 传统的BIO编程 以服务器为例,在传统BIO模型下的服务器,每当一个新的请求到来的时候回分配一个线程去处理该请求,并且该线程在执行IO操作的时候会一直阻塞,知道IO操作完成或抛出异常才会返回. ...

  5. java 爬虫:开源java爬虫 swing工具 Imgraber

    1实现点: 1.返回给定URL网页内,所有图像url list 2.返回给定URL网页内,自动生成图像文件路径.txt 文件 3.返回给定URL网页内,下载txt文件指定的图片url,并将所有图像保存 ...

  6. 远程 Linux(Ubuntu 18)添加字体

    安装 xshell与xftp 连接xshell 点击 xshell上方工具栏中的xftp图标, 自动连接xftp linux下创建字体目录 su cd / cd usr/share/fonts mkd ...

  7. OpenWrt增加软件包

    变量名含义 SECTION //包的种类 CATEGORY //显示在menuconfig的哪个目录下 SUBMENU //menuconfig子目录 TITLE //简单的介绍 DESCRIPTIO ...

  8. 6.JUC之ReentrantReadWriteLock

    一.概述: Java纪年1.5年,ReentrantReadWriteLock诞生于JUC,此后,国人一般称它为读写锁.人如其名,他就是一个可重入锁,同时他还是一个读写锁 a)跟ReentrantLo ...

  9. springboot学习入门简易版二---springboot2.0项目创建

    2 springboot项目创建(5) 环境要求:jdk1.8+ 项目结构: 2.1创建maven工程 Group id :com.springbootdemo Artifact id: spring ...

  10. echart——关系图graph详解

    VueEchart组件见上一篇 <template> <VueEcharts :options="options" auto-resize /> </ ...