无向图三元环计数

news/2024/10/5 23:36:12/文章来源:https://www.cnblogs.com/QcpyWcpyQ/p/18286457

Description

P1989 无向图三元环计数

给定简单无向图 \(G=(V,E)\),求其三元环个数,其中 \(\lvert V\rvert\leq10^5,\lvert E\rvert\leq 2\times 10^5\)

Solution

考虑给每一个边定一个方向。具体地,对于原图的一条边 \(E=(u,v)\),有

  • \(\deg_u>\deg_v\)\(\text{deg}_u=\text{deg}_v\land u<v\),则 \(u\to v\)
  • 否则 \(v\to u\)

给边定完方向后,原图变成了一个有向无环图 。

注意到原图中的三元环一定与对应有向图中所有形如 \(E'=(u\to v,u\to w,v\to w)\) 的子图一一对应。

只需要枚举 \(u\) 的出边,再枚举 \(v\) 的出边,然后检查 \(w\) 是否为 \(u\) 指向的点即可。时间复杂度为 \(\mathcal O(m\sqrt m)\)

  • 为什么时间复杂度为 \(O(m\sqrt m)\)​?

首先在在枚举 \(u\) 的出边时打上 \(u\) 的时间戳,这样在枚举 \(v\) 的出边时可以 \(O(1)\) 判断。

那么考虑每一条边 \(u\to v\) 的贡献为 \(out_v\),所以总复杂度为 \(\sum\limits_{i=1}^{m} out_{v_i}\),其中 \(v_i\) 是第 \(i\) 条边指向的点, \(out_v\) 是点 \(v\)​ 的出度。

对于每一个点 \(v\) 分情况讨论。

  1. 当在原图上 \(\deg_v\leq\sqrt m\) 时,由于新图每个节点的出度不可能大于原图的度数,所以 \(out_v=O(\sqrt m)\)
  2. 当在原图上 \(\deg_v>\sqrt m\) 时,注意到它只能向原图中度数不小于它的点连边,又因为原图中所有的点的度数和为 \(O(m)\),所以原图中 \(\deg>\sqrt m\) 的点只有 \(O(\sqrt m)\) 个。因此 \(v\) 的出边只有 \(O(\sqrt m)\) 条,即 \(out_v=O(\sqrt m)\)

综上所有点的度数都为 \(O(\sqrt m)\),总复杂度就为 \(O(m\sqrt m)\)

Code

const int N=1e5+5;
int n,m,deg[N],vis[N],ans;
struct E{int u,v;}e[N*3];
vector<int>G[N];signed main(){n=read();m=read();for(int i=1;i<=m;i++){e[i]=(E){read(),read()};deg[e[i].u]++;deg[e[i].v]++;}for(int i=1;i<=m;i++){int u=e[i].u,v=e[i].v;if(deg[u]<deg[v] or (deg[u]==deg[v] and u>v))swap(u,v);G[u].eb(v);}for(int u=1;u<=n;u++){for(auto v:G[u])vis[v]=u;for(auto v:G[u])for(auto w:G[v])if(vis[w]==u)ans++;}write(ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】pip已经安装好了模块,运行代码还是报错说没安装

在 Python 开发中,有时用 pip 安装了模块,运行代码时却提示没安装,这让人很困惑。下面来看看可能的原因和解决办法可能原因:1. 虚拟环境出错:如果用了虚拟环境,可能装错了地方,运行代码时用的环境没装这个模块。2. Python 版本不同:安装模块和运行代码的 Python 版本不…

# Day01

愿你自由如夏天的风,去实现所有开出花来的梦 Ctrl+C复制 Ctri+V粘贴 Crtl+A全选 Crtl+X剪切 Crtl+Z撤销 Crtl+S保存 …

关于平衡树(施工中)

关于Splay$\LARGE {一些无聊的定义}$ 二叉搜索树(BST树) 定义 二叉搜索树是一种二叉树的树形数据结构,其定义如下:空树是二叉搜索树。若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。若二叉搜索树的右子树不为空,则其右子树上所有点的附加权…

Linux 提权-SUID/SGID_1

本文通过 Google 翻译 SUID | SGID Part-1 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 了解特殊权限 2 寻找 SUID/SGID 二进制文件 – 手动方法2.1 枚举 SUID 二进制文件 2.2 枚举 SGID 二…

Java解析并修改JSON:将isShow属性改为false

哈喽,大家好,我是木头左!在Java中,可以使用各种库来处理JSON数据。其中,Jackson和Gson是两个非常流行且功能强大的库。在这篇文章中,将使用Jackson库来解析给定的JSON字符串,将其转换为Map对象,然后修改其中的"isShow"属性,最后再将其转回JSON字符串。 准备…

#cmd的常用命令(Dos)

cmd的常用命令首先win+r输入cmd并回车进入cmd命令中cd 命令:进入指定目录cd d:进入d盘目录.会发现进入不了d盘,因为cd只能在当前目录下操作不能跨区操作. 键入d:回车进入d盘.我d盘下有aaa文件夹cd aaa进入文件夹aaa目录下提示 ".."为上一级目录."."为当前…

StarRocks数据导入慢问题解决

一、问题描述依据StarRocks官网快速开始安装教程,用docker compose安装了starrocks,log模块从rabbitMq的队列批量获取log消息,发现队列消息有堆积,一晚上下来大概能对接4000条消息。经单元测试发现insert into到starrocks中时间竟然相差几百倍。 mysql每条insert sql执行3.…

CAN转PN网关模块连接激光切割机的配置方法

本文介绍了兴达易控CAN转Profinet网关模块(XD-PN_CAN20)用于连接CAN激光切割机的使用方法,激光切割机在工业生产中被广泛应用,而激光发射器与控制设备常以不同的协议存在两者之间,CAN总线和Profinet以各自的特点被广泛用于设备当中。本文将介绍介绍兴达易控CAN转Profinet网…

R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据

全文下载链接: http://tecdat.cn/?p=26105 最近我们被客户要求撰写关于LCTM的研究报告,包括一些图形和统计输出。 在本文中,潜类别轨迹建模 (LCTM) 是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集…

第二章 和式

记号 求和的符号有两种形式 第一种是确定界限的形式,也叫封闭形式,例如:\(\sum\limits_{k=1}^n a_k\) 第二种叫做一般形式,就是把一个或者多个条件写在 \(\sum\) 符号的下面,例如刚刚的例子可以写成 \(\sum\limits_{1\le k \le n} a_k\) 和式和递归式的转化 和式和递归式之…

Andriod SDK安装教程

前言 最简单的方式 我们使用ANDROID STUDIO这款开发工具下载对应的Andriod SDK。 可是我们如果不开发安卓,只是用它的一些SDK包的话而安装整个开发工具,就没必要了。 这里讲的是用独立的 命令行工具 来操作。 下载命令行工具 点击此处进入下载页面, 滑动到最下边,选择合适的…

动态规划--打家劫舍-零钱兑换-算法刷题01

目录1. 概念2. 打家劫舍3 零钱兑换 1. 概念 关于动态规划这类问题 强烈建议学完下面的帖子: https://blog.csdn.net/qq_16664581/article/details/89598243 理解动态规划的使用场景强烈建议读一下这个故事: https://www.cnblogs.com/sdjl/articles/1274312.html 步骤:确定问…