三元环 四元环

枚举三元环

枚举无向图三元环,将无向图转变成有向图,对于一条无向边,定义它的方向为度数大的点连向度数小的点。

我们可以先枚举一个点\(i\),再枚举i连出的点\(j\),再枚举\(j\)连出的点\(k\),如果\((i,k)\)有边,\(ans++\)

复杂度:O($m \sqrt{m} $)

复杂度证明:考虑枚举\(i\)和\(j\)等同于枚举每条边\((i,j)\),如果\(j\)的度数小于\(\sqrt{m}\) ,那么对于每一条边\((i,j)\) 枚举的\(k\)的次数小于$ \sqrt{m}$ 。如果\(j\)的度数大于\(\sqrt{m}\) ,那么这样的\(j\) 的不会超过\(\sqrt{m}\) 个,又\(i\) 点度数比\(j\)大,这样的\(i\)点也不会超过\(\sqrt{m}\)个,计算次数为

\(cnt=\sum_{j,deg[j]>\sqrt{m}}indeg(j)*outdeg(j)<=\sqrt{m}*\sum_{j,deg[j]>\sqrt{m}}outdeg(j)<=\sqrt{m}*m\)

枚举四元环

同三元环,将无向图转变成有向图,对于一条无向边,定义它的方向为度数大的点连向度数小的点。

我们可以先枚举一个点\(i\),再枚举i连出的点\(j\),再枚举\(j\)连出的点\(k\),\(ans+=num(i,j),num(i,j)++\)

复杂度:\(O(m*\sqrt{m})\)

复杂度证明:同上

原文地址:https://www.cnblogs.com/zhongzero/p/11788484.html

时间: 2024-11-07 14:03:33

三元环 四元环的相关文章

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 Great Arya and Pari The Great. These two had some problems about the numbers they like, so they decided to divide the great kingdom between themselves. The

判断单向链表是否有环,环起点,环长,链表长

今天在微信上看到一篇介绍如何判断单向链表是否有环的文章,感觉很有意思,整理一下读后的思路. 一.判断单向链表是否有环 方法1:设置一个Hashset,顺序读取链表中的节点,判断Hashset中是否有该节点的唯一标识(ID).如果在Hashset中,说明有环:如果不在Hashset中,将节点的ID存入Hashset. 这种方法时间复杂度已经最优,但是因为额外申请了Hashset,所以空间复杂度不算最优. 方法2:设置2个指针,指向头节点.第1个指针每次指向下一个节点:第2个指针指向下一个节点的下一

求有环单链表中的环长、环起点、链表长

1.判断单链表是否有环 使用两个slow, fast指针从头开始扫描链表.指针slow 每次走1步,指针fast每次走2步.如果存在环,则指针slow.fast会相遇:如果不存在环,指针fast遇到NULL退出. 就是所谓的追击相遇问题: 2.求有环单链表的环长 在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步.在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长. 设从第一次相遇到第二次相遇,设slow走了len步,则fast走

如果单链表有环,求环的起始位置

问题:如果单链表中存在环,求环的起始位置 解:在上篇文章中,利用追逐法判断一个单链表是否存在环.求环的起始位置,需要求解单链表的长度和环的长度的关系.如果确定了单链表的长度和环的长度的关系,那么环的起始位置就呼之欲出了. 在判断单链表中有两个指针P和q,p每次前进两步,q每次前进一步,p的速度是q的两倍.设单链表的长度为L,环的长度为R,链表起点到环起点的距离为X,当p和q相遇时,慢指针总共走了S步,在环内总共走了a步,快指针总共走了2S步,此时满足:2S=S+n*R,所以S=n*R. S=X+

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短

利用RK4更新四元數並轉換成歐拉角及 OpenGL 的 Viewer

開發平台 : Odroid-U2 四元數更新 : quat.c #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979323846 //#define M_PI 3.14 #define D2R(x) ((x) * M_PI/180) #define R2D(x) ((x) * 180/M_PI) #define NUM 4 void RK4(float

Windows系统调用中API从3环到0环(下)

 Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(下) 如果对API在三环的部分不了解的,可以查看 Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数 上篇:Windows系统调用中API从3环到0环(上) 这篇文章分为上下两篇,其中上篇初步讲解大体轮廓,下篇着重通过实验来探究其内部实现,最终分析两个函数(快速调用与系统中断)

单链表的环入口,环大小,解环

1.单链表是否有环 使用快慢指针,都从head出发,慢指针一次一步,快指针一次两步,如果两个指针相遇,说明链表有环,否则,快指针为null或其next为null,到达末尾节点 function hasCircle(head){ var slow = head, fast = head; while(fast && fast.next){ slow = slow.next; fast = fast.next.next; if(slow == fast){ break; } } return

笔试,面试,C/C++,判断单链表是否带环?若带环,求环长度,求环入口点(两种方法)

SListNode* IsRing(SListNode *&pHead) //判断链表是否有环,求相聚点 {  //判空.有.没有  //思路:两个指针从头开始一快(2步)一慢(1步),若最后可以相聚,则链表有环  if (pHead)  {   SListNode *fast = pHead;   SListNode *slow = pHead;   while (fast&&fast->next)   {    fast = fast->next->next;