【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

三元环计数和四元环计数问题

  • 无向图三元环计数问题
    • 根号分治
    • bitset
  • 无向图四元环计数问题
  • 有向图三四元环计数问题

无向图三元环计数问题

根号分治

di:id_i:idi:i 在原图中的度数。

按照以下规则改写无向图为有向图:

  • 对于一条边 u,vu,vu,v
    • 如果两点度数不同,则度数大的指向度数小的。
    • 如果两点度数相同,则编号小的指向编号大的。

「其实只需要定一个有序的规则即可,可以是度数小的指向大的,可以是编号大的指向小的,都不影响。」

显然,这个有向图同时也是个无环图。

证明:

假设存在一个环 (x0,x1,x2,...,xk)(x_0,x_1,x_2,...,x_k)(x0,x1,x2,...,xk)

则有 dx0≥dx1≥dx2≥...≥dxkd_{x_0}\ge d_{x_1}\ge d_{x_2}\ge ...\ge d_{x_k}dx0dx1dx2...dxk

dx0=...=dxkd_{x_0}=...=d_{x_k}dx0=...=dxk

所以 x0<x1<x2<...<xk<x0x_0<x_1<x_2<...<x_k<x_0x0<x1<x2<...<xk<x0,矛盾。

所以三元环 (u,v,w)(u,v,w)(u,v,w) 在新图中的边一定是:u→v,u→w,v→wu\rightarrow v,u\rightarrow w,v\rightarrow wuv,uw,vw

考虑在 uuu 点记录这个三元环的贡献。

将所有与 uuu 直接相连的点打上标记,再从中枚举点作 vvv ,枚举与 vvv 直接相连的点 www ,检查 www 是不是 uuu 指向的点即可。

时间复杂度为 O(mm)O(m\sqrt{m})O(mm)

证明:

将枚举 www 的复杂度记在 u→vu\rightarrow vuv 边上,显然为 outvout_voutv 。「outv:vout_v:voutv:v 的出度」

则总复杂度为 ∑(u,v)∈Eoutv+∑uoutu\sum_{(u,v)\in E}out_v+\sum_{u}out_u(u,v)Eoutv+uoutu

  • outv<mout_v<\sqrt{m}outv<m,则复杂度为 O(mm)O(m\sqrt{m})O(mm)

  • outv>mout_v>\sqrt{m}outv>m,因为有向图的连边规则,有 outu≥outv>mout_u\ge out_v>\sqrt{m}outuoutv>m

原无向图的总边数为 mmm,所以这样的 (u,v)(u,v)(u,v) 仅有 m\sqrt{m}m 个,复杂度为 OmO\sqrt{m}Om

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 200005
vector < int > G[maxn];
int n, m;
int d[maxn], Eu[maxm], Ev[maxm], vis[maxn];bool cmp( int x, int y ) {return d[x] == d[y] ? x < y : d[x] > d[y];
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= m;i ++ ) {scanf( "%d %d", &Eu[i], &Ev[i] );d[Eu[i]] ++, d[Ev[i]] ++;}for( int i = 1;i <= m;i ++ )if( cmp( Eu[i], Ev[i] ) ) G[Eu[i]].push_back( Ev[i] );else G[Ev[i]].push_back( Eu[i] );int ans = 0;for( int i = 1;i <= n;i ++ ) {for( int j : G[i] ) vis[j] = i;for( int j : G[i] )for( int k : G[j] ) if( vis[k] == i ) ans ++;}printf( "%d\n", ans );return 0;
}

bitset

bitset 其实是一种二进制的优化。

只要想要的信息可以转化为被 0/10/10/1 表示出来,在空间不炸的情况下,bitset 自带 /ω/\omega/ω 的复杂度。

将与 iii 点直接相连的所有点对应在 iiibitset 中位置置为 111,表示两点有边相连。

然后就直接枚举每条边,将边的两个端点的 bitset 取个 &,就得到了与两点均直接相连的所有点集合。

空间复杂度为 O(n2)O(n^2)O(n2) ,来自 bitset

时间复杂度为 O(nmω)O(\frac{nm}{\omega})O(ωnm)

如果有些题目空间比较卡,不能直接硬开。

其实是给每个点很大一段的 000 开完整 bitset 空间就会被大幅度浪费。

那么就可以设定一个阈值 BBB「分块的阈值」。

对于度数 >B>B>B 的点就开完整的 bitset,这种点不会超过 min⁡(n,mB)\min(n, \frac{m}{B})min(n,Bm) 个。

度数 ≤B\le BB 的点就直接暴力枚举连边,暴力判断。

所有度数 >B>B>B 的点最多会被 O(m)O(m)O(m) 条边枚举到,一次计算是 O(mω)O(\frac{m}{\omega})O(ωm),时间复杂度为 O(nmω)O(\frac{nm}{\omega})O(ωnm)

度数 ≤B\le BB 的点的贡献是 d2d^2d2,则有 ∑d≤m,d≤B\sum_d\le m,d\le Bdm,dB,总共为 ∑d2≤B⋅m\sum d^2\le B·md2Bm

时间复杂度为 O(nmω+B⋅m)O(\frac{nm}{\omega}+B·m)O(ωnm+Bm),空间复杂度就降为了 O(nmB)O(\frac{nm}{B})O(Bnm)

「根据具体题目的时空灵活选取阈值 BBB,在不甚了解三元环的根号分治时,bitset 这种优美的暴力来的快也好写/doge」

无向图四元环计数问题

同样按照三元环计数问题的方法来建立有向图,并给每一个点分配唯一的 rankrankrank 排名。

则一个四元环在新图中至少有一个,至多有两个度数为 222 的点。

这时会发现原图的四元环 (u,v,w,x)(u,v,w,x)(u,v,w,x) 在新建的有向图中会有两种情况。

  • u→v→w,u→x→wu\rightarrow v\rightarrow w,u\rightarrow x\rightarrow wuvw,uxw
  • u→v→w→x,u→xu\rightarrow v\rightarrow w\rightarrow x,u\rightarrow xuvwx,ux

发现这两种形式都可以由 两条无向边+两条有向边 形式表示。

所以一个四元环唯一的表示为:u−v→w,u−x→wu-v\rightarrow w,u-x\rightarrow wuvw,uxw,且 rank(u)rank(u)rank(u) 最小,rank(w)rank(w)rank(w) 最大,这样才能保证一个四元环不被反复计算。

枚举点 uuu,枚举其在原图的出边 vvv,枚举 vvv 的在新图上所有出边 www,且要满足 rank(u)<rank(v)<rank(w)rank(u)<rank(v)<rank(w)rank(u)<rank(v)<rank(w)

ans←cntwans\leftarrow cnt_wanscntw,再 cntw++cnt_w++cntw++,最后 uuu 更换的时候,所有 cntcntcnt 都要清零。

在上述过程中,cntw:wcnt_w:wcntw:w 的入度,且 rank(w)rank(w)rank(w) 最大 rank(u)rank(u)rank(u) 最小,那么当有两组 (u,v1,w),(u,v2,w)(u,v_1,w),(u,v_2,w)(u,v1,w),(u,v2,w) 的时候代表找到了一个四元环。

虽然环有对称性,但这样处理后一个四元环只会从 uuu 算到 www 上。

时间复杂度为 O(mm)O(m\sqrt{m})O(mm)。证明与三元环一样。

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
vector < int > G[maxn], E[maxn];
int n, m;
int d[maxn], id[maxn], rnk[maxn], cnt[maxn];int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );E[u].push_back( v );E[v].push_back( u );d[u] ++, d[v] ++, id[i] = i;}sort( id + 1, id + n + 1, []( int x, int y ) { return d[x] == d[y] ? x < y : d[x] > d[y]; } );for( int i = 1;i <= n;i ++ ) rnk[id[i]] = i;for( int i = 1;i <= n;i ++ ) for( int j : E[i] ) if( rnk[j] > rnk[i] ) G[i].push_back( j );int ans = 0;for( int i = 1;i <= n;i ++ ) {for( int j : E[i] ) for( int k : G[j] ) if( rnk[k] > rnk[i] ) ans += cnt[k], cnt[k] ++;for( int j : E[i] ) for( int k : G[j] ) cnt[k] = 0;} printf( "%d\n", ans );return 0;
}

有向图三四元环计数问题

按照无向图的方法做,求出一个元环后直接随便选一个点开始左右两个方向都走一圈,看能不能回到开始点,就知道无向图上的元环能否用原有向图上的边构造出来。

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

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

相关文章

.net Core2.2 WebApi通过OAuth2.0实现微信登录

前言微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。微信网页授权是通过OAuth2.0机制实现的&#xff0c;所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。开发流程1、新建一个…

Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链 Nginx优化(重点)与防盗链一、隐藏Nginx版本号1、修改配置文件2、修改源代码 二、修改Nginx用户与组1、编译安装时指定用户与组2、修改配置文件指定用户与组 三、配置Nginx网页的缓存时间四、实现Nginx的日志切割1、data的用法2、编写脚本进行日志切割的…

Almost Sorted Array HDU - 5532

Almost Sorted Array HDU - 5532 题意&#xff1a; 如果一个数组的元素“按非递减或非递增顺序排列”&#xff0c;那么称这个数组有序。现在&#xff0c;LYD给了你一个数组a&#xff0c;他让你从中选择并移除仅仅1个元素&#xff0c;请问剩下的元素构成的数组有可能是有序的吗…

CF906D:Power Tower(拓展欧拉定理、暴力)

解析 大降智题。 受相逢是问候的影响&#xff0c;第一眼直接线段树&#xff0c;写完WA完才发现这个玩意没有结合律。 然后开始用 xyz(xy)yz−1x^{y^z}(x^y)^{y^{z-1}}xyz(xy)yz−1 这样的东西嗯做&#xff0c;结果只是在玩泥巴。 lemma&#xff1a;迭代求 φ\varphiφ 的次数是…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意&#xff1a; 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时&#xff0c;这个队的名次会变化 tit_iti​。 注意在别的队揭榜时&#xff0c;自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新&#xff08;差不多有10个月的时间了&#xff09;&#xff0c;在此先说声抱歉&#xff0c;Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样&#xff0c;而Ocelot也从5.0版本更新到了13.x版本&#xff0c;进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路&#xff1a;把询问离线&#xff0c;移动右端点&#xff0c;维护左端点答案。 考虑暴力维护&#xff0c;对于当前的 aixa_ixai​x&#xff0c;左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意&#xff1a; 通常制造商认为1“kilo”等于1000&#xff0c;但操作系统会认为是1024。 因此&#xff0c;当你购买了一个100MB的硬盘&#xff0c;电脑却只显示大约有95MB&#xff0c;这缺失了大约5MB。 对于硬盘的大小&#xff0c;有多种单位描…

货币系统(二分)

problem 【题目描述】 你在 NOIP 2018 的赛场上遇到了「货币系统」一题。你没有写出这题&#xff0c;导致网友的国度简化货币系统的任务失败了。网友的国度的货币系统现在十分混乱。 网友的国度现今有两套货币系统「忘忧」和「网游」。为了方便使用&#xff0c;它们有一个共用…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦&#xff0c;新的地址为&#xff1a;https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

区域赛铜牌专题(一)

区域赛铜牌专题 题号题目知识点HDU 5532Almost Sorted Array贪心,LISHDU 5533Dancing Stars on MeHDU 5536Chip FactoryHDU 5538House BuildingHDU 5510BazingaHDU 5512PagodasHDU 4788Hard Disk DriveHDU 4821String计蒜客 42405TriangleHDU 4810Wall PaintingHDU 4771Steali…

P3581 [POI2015] CZA(状压)

解析 不能在一条思路上死磕&#xff01; 首先这题真正考的其实就是 p3p3p3。 乍一看题意&#xff1a;给出一张特殊图&#xff0c;求哈密顿回路方案数。 然后发现这个图性质不咋地。 然后就不会了。 … 正解根本和哈密顿回路毛关系也没有&#xff01; 考虑从1-n依次插入。 注…

[Wf2011]Chips Challenge(最小费用最大流)

[Wf2011]Chips Challengeproblemsolutioncodeproblem BZOJ2673 solution . 首先得知道这是网络流&#xff0c;但真的看不出来啊&#xff01;&#xff01;我真的郁闷啊(&#xffe3;﹏&#xffe3;&#xff1b;) 在知道做法是网络流后&#xff0c;初读题&#xff0c;肯定会…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

BZOJ4294 : [PA2015]Fibonacci(dfs、暴力、数位dp)

解析 新定义数位dp了属于是。 结论&#xff1a;斐波拉契在模 10m10^m10m 的意义下循环节为 6*10^m。 但这个不一定是最小循环节&#xff0c;我自己做的时候打表得出来的循环节更小。 考虑从低到高枚举周期中的位置&#xff0c;暴力check合法进行剪枝。 跑的飞快&#xff0c;O…

Chip Factory HDU - 5536

Chip Factory HDU - 5536 题意&#xff1a; 给你n个数&#xff0c;让你从中选出i&#xff0c;j&#xff0c;k三个下标&#xff0c;求最大的 &#xff08;a[i]a[j]&#xff09;^ a[k] 题解&#xff1a; 这种查找最大异或一般有两个方向&#xff0c;一个是有公式推导规律可循…

AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

AtCoder Regular Contest 061 E - Snuke’s Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流&#xff0c;所以一读这题后&#xff0c;我就想到了最小费用流。 首先的问题就是建边问题。 不同线路到达同一个点从而引发后面的费用是相互独立的&#xff0c;不能由…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

HDU5519:Kykneion asma(容斥)

计数的核心是双射。 解析 这也叫数位dp呗… 首先&#xff0c;这个题目的形式很容易令人想到硬币购物&#xff0c;考虑用容斥解决&#xff0c;暴力枚举强制超额的数的集合然后分别计算贡献。 然而&#xff0c;暴力dp计算贡献的复杂度是 O(n2)O(n^2)O(n2) 的。 考虑换一种统计…

Dancing Stars on Me HDU - 5533

Dancing Stars on Me HDU - 5533 题意&#xff1a; LYD又来了&#xff0c;这次他碰到了一个小问题&#xff0c;给定n个点&#xff0c;点的坐标为均为整数&#xff0c;问这些点能否组成正多边形&#xff1f; 题解&#xff1a; 如果是正多边形&#xff0c;那中心的坐标就是所…