首页 > 其他分享 >环计数

环计数

时间:2024-08-01 16:31:59浏览次数:13  
标签:复杂度 sqrt 三元组 计数 枚举 三元

前言

本文仅为个人记录,参考价值不大,且仅写了几个例题,以后遇到这方面的题会再补充。

三元环计数

实现

首先显然有 \(O(nm)\) 的暴力,考虑优化这个过程。
将点按度数从小到大排序,若度数相等则按编号大小排序,然后将原来的无向边变为从前往后的有向边,在原图中的三元环 \((u,v,w)\) 变为在新图中的三条有向边\((u,v),(v,w),(u,w)\),考虑枚举 \(u\) 及其出边 \((u,v)\),并枚举 \(v\) 的出边 \((v,w)\),判断是否存在边 \((u,w)\) 即可。
直接看上去时间复杂度似乎是 \(O(m^2)\) 的,但是实际上复杂度味 \(O(m\sqrt m)\),以下为分析:

  • 若 \(v\) 出度 \(\le \sqrt m\),时间复杂度为 \(O(\sqrt m)\)
  • 若 \(v\) 出度 \(\ge \sqrt m\),因为序列按出度从小到大排序,之后的点度数必然 \(\ge \sqrt m\),而这样的点仅有 \(\sqrt m\) 个,所以时间复杂度为 \(O(\sqrt m)\)

综上,时间复杂度为 \(O(m\sqrt m)\)。

代码

void Main(){
	n=rd,m=rd;
	for(int i=1;i<=m;i++)
		deg[A[i]=rd]++,deg[B[i]=rd]++;
	for(int i=1;i<=m;i++){
		int u=A[i],v=B[i];
		if(deg[u]>deg[v]) swap(u,v);
		else if((deg[u]==deg[v])&&u>v) swap(u,v);
		G[u].pb(v);
	}
	long long ans=0;
	for(int u=1;u<=n;u++){
		for(int v:G[u]) vis[v]=u;
		for(int v:G[u]) for(int w:G[v])
			if(vis[w]==u) ans++;
	}
	cout<<ans<<endl;
}

例题

I.CodeForces - 985G

既然三个点不相邻十分难求,我们不如换个角度,求出所有三个点至少有一条边相邻的和即可,但是直接统计会重复,可以通过容斥解决。
以下为容斥的具体分析:
我们考虑求至少有一条边相邻的和会重复统计什么,我们发下如果有一个三元组至少有两条边那么就会被统计多次,需要减掉,但是又会多减去一部分,即三元环的和,加上即可。
对于求三元组至少有一条边的和,可以枚举边 \((u,v)\),然后对 \(w\) 的位置分讨即可。
对于求三元组至少有两条边的和,可以枚举中间点 \(v\),则 \(u,w\),都为 \(v\) 的邻点,将边按照大小排序,枚举节点 \(u\) 统计答案即可。
对于求三元环,你才为什么这道题是例题,直接按照三元环计数的方法统计即可,(其实这道题和三元环计数关系不大,但是比较妙就写进来了。
Code

标签:复杂度,sqrt,三元组,计数,枚举,三元
From: https://www.cnblogs.com/smilemask/p/18336907

相关文章

  • 每组具有归一化 y 轴的计数图
    我想知道是否可以创建Seaborn计数图,但不是显示y轴上的实际计数,而是显示其组内的相对频率(百分比)(如hue参数指定)。I使用以下方法解决了这个问题,但我无法想象这是最简单的方法:#Plotpercentageofoccupationperincomeclassgrouped=df.groupby(['income'],......
  • 有没有办法根据 Pandas GroupBy 的计数在 2 个数据帧之间重复分配值?
    我有两个结构相同但形状和值不同的Pandas数据框:importpandasaspddataframe_1=pd.DataFrame({'customer_id':['id1','id2','id3','id4','id5','id6'],'gender':[......
  • 关于最短路、次短路计数
    最短路计数题意给出一个 \(N\) 个顶点 \(M\) 条边的无向无权图,顶点编号为 \(1\) 到 \(N\)。问从顶点 \(1\) 开始,到其他每个点的最短路有几条。分析我们可以用BFS计算出源点\(1\)到其他点的最短距离序列\(dis\),由于BFS弹出队列的顺序是拓扑序,因此在BFS的过......
  • P5825 排列计数 加强版
    加强版和原题不同之处在于\(p\)不再是一个排列,而是一个普通的值域为\([1,n]\)的数组考虑将\([p_i<p_{i+1}]\)转化为\(1-[p_i\gep_{i+1}]\),方便计算后面的\(g\),也就是恰好\(n-k-1\)不上升点的方案数记一段不上升点的连续段为非升段,\(f_i\)表示恰好\(i\)个不上升......
  • 在 Python 中读取部分 MP3 文件时处理“对于可用位计数来说太大”错误
    我正在尝试读取MP3文件的特定部分,但遇到错误:[src/libmpg123/layer3.c:INT123_do_layer3():1771]error:part2_3_length(1376)toolargeforavailablebitcount(760)可以访问音频文件此处我的环境是使用此Docker映像设置的:pytorc......
  • P1989 无向图三元环计数
    原题链接题解暴力方法:遍历每个节点,遍历每个节点的子节点,遍历每个子节点的子节点,看看子子节点是否是节点的子节点,时间复杂度\(O(nm^2)\)优化考虑无向边建边的时候建成有向边,且两个点建边时,度数小的指向度数大的,如果度数相等,编号小的指向编号大的(其实这一步是为了避免重复计数......
  • 【MATLAB源码】机器视觉与图像识别技术(4)---模式识别与视觉计数
    系列文章目录第一篇文章:【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载)第二篇文章:【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础第三篇文章:【MATLAB源码】机器视觉与图像识别技术(2)续—图像分割算法第四篇文章:【MATL......
  • 按小计和计数对 Pandas 数据框进行排序
    我有一个非常大的数据集,名为bin_df。使用pandas和以下代码,我为每个组分配了小计“总计”:bin_df=df[df["category"].isin(model.BINARY_CATEGORY_VALUES)]bin_category_mime_type_count_df=(bin_df.groupby(["category","mime_type&quo......
  • 汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法
    汉明权重(HammingWeight)(统计数据中1的个数)VP-SWAR算法定义汉明重量是一串符号中非零符号的个数。它等于同样长度的全零符号串的汉明距离(在信息论中,两个等长字符串之间的汉明距离等于两个字符串对应位置的不同字符的个数)。汉明重量在常见的数据位符号串中,它是1的个数。......
  • YC322A [ 20240724 CQYC NOIP 模拟赛 T4 ] 庫的 序计数(counting)
    题意给定一棵树\(T\),每次操作在某个点下方接上\(k\)个儿子。询问期望多少次排列,使得\(a_{fa_i}<a_i\)。保证\(k\)是偶数,对\(65536\)取模。\(n\le10^5,k\le2\times10^9\)。Sol考虑假如已经确定了一棵树的形态,如何求出最终的答案?可以发现对于每一个节点......