如何在图形中找到三角形?

2024-01-04

这是一个练习算法设计手册 http://www.algorist.com/.

考虑判断给定的无向图 G 是否为 = (V, E) 包含长度为 3 的三角形或环。

(a) 给出一个 O(|V |^3) 来查找三角形(如果存在)。

(b) 改善 您的算法运行时间为 O(|V |·|E|)。你可以假设 |V | ≤ |E|。

请注意,这些界限让您有时间在 G 的邻接矩阵和邻接表表示。

这是我的想法:

(a) 如果图以邻接列表的形式给出,我可以通过 O(|V|^2) 将列表转换为矩阵。然后我这样做:

for (int i = 0;i < n;i++) 
   for (int j = i+1;j < n;j++) 
   if (matrix[i][j] == 1) 
      for (int k = j+1;k < n;k++) 
         if (matrix[i][k] == 1 && matrix[j][k] == 1)
             return true;

这应该给出 O(|V|^3) 来测试三角形。

(b) 我的第一个直觉是,如果图以邻接表的形式给出,那么我将执行 bfs。例如,每当发现交叉边缘时,if y-x is a cross edge, 接着我会check whether parent[y] == parent[x], if true, then a triangle is found.

谁能告诉我我的想法是否正确?

同样对于这个(b),我不确定它的复杂性。应该是 O(|V| + |E|),对吗?

我怎样才能在 O(|V|*|E|) 中做到这一点?


一个可能的O(|V||E|)解决方案,与(a)中的暴力破解思路相同:

for each edge (u, v):
  for each vertex w:
     if (v, w) is an edge and (w, u) is an edge:
          return true
return false

检查所有边缘, and not所有顶点对 - 与形成三角形的另一个顶点 - 有足够的信息来确定边和顶点是否形成可行的解决方案。

BFS解决方案的反例:

       A
     / | \
    /  |  \
   B   C   D
   |   |   |
   |   |   |
   F---G---H
   |       |
   ---------
    (F, H) is also an edge

注意father[F] != father[G] != father[H],因此算法将返回 false - 但尽管如此,(F, G, H) 是一个可行的解决方案!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在图形中找到三角形? 的相关文章

  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • 融合元组以查找等价类

    假设我们有一个包含 k 个元素的有限域 D d1 dk 我们认为 S 是 D n 的子集 即一组 形式的元组 其中 ai 在 D 中 我们希望使用 S 2 D n 的子集 即一组 形式的元组 其中 Ai 是 D 的子集 来 紧凑地 表示它
  • 基于 2 个输入的伪随机数生成器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据 2 个输入值 X 和 Y 生成一个伪随机数 给定相同的 X 和 Y 值 我需要得到相同的结果 结果应介于 0 和 1 之间 含
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 将数字的各个数字部分相加/求和的最快方法

    不久前 我在数学论坛上看到一个问题 其中一个人正在讨论一遍又一遍地将数字中的数字相加 直到达到个位数 即 362 将变成 3 6 2 这将变成 11 然后 11 将变成 1 1 将变成 2 因此 362 将返回2 我写了一些很好的代码来得到
  • 数字求和的算法?

    我正在寻找一种数字求和的算法 让我概述一下基本原则 假设你有一个号码 18268 1 8 2 6 8 25 2 5 7 7 是我们的最终数字 它基本上是将整个数字中的每个数字相加 直到我们得到一个 也称为 核心 数字 它经常被命理学家使用
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • O(n^2) 与 O (n(logn)^2)

    时间复杂度是O n 2 or O n logn 2 better 我知道当我们简化它时 它就变成了 O n vs O logn 2 and logn lt n 但是关于logn 2 n is only less than log n 2 f
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • Python - 在大型数据集上计算多项概率密度函数?

    我原本打算使用 MATLAB 来解决这个问题 但内置函数有局限性 不适合我的目标 NumPy 中也存在同样的限制 我有两个制表符分隔的文件 第一个是显示内部蛋白质结构数据库的氨基酸残基 频率和计数的文件 即 A 0 25 1 S 0 25
  • python数据结构(类似设置)在添加重复项时抛出异常

    我正在寻找一种在添加重复元素时会引发异常的数据结构 我发现的最接近的是collections Counter gt gt gt from collections import Counter as counter gt gt gt c co
  • 仅使用两个变量交换两个数字

    它如何执行交换 a a b b a b a b a 我不同意把它换成书 书中的选项包括 a和b的值的补集 否定和b 希望这些选项也不能满足它 正确的算法应该是 a a b b a b a a b
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod

随机推荐

  • 将树状图与 Python 的 scipy.cluster.hierarchy 中的簇号进行匹配

    以下代码生成一个具有 10 个叶节点的简单层次聚类树状图 import scipy import scipy cluster hierarchy as sch import matplotlib pylab as plt X scipy r
  • Python tkinter画布闪烁

    首先 我应该声明 我知道该网站上还有其他名称相似的帖子 我已经经历过它们 但据我所知 它们并没有解决我的问题 实际上我想说我的问题比大多数例子要简单得多 简而言之 我想创建一个透明矩形 可以用来显示拖动选择区域 当我发现 tkinter 不
  • 我制作的相机效果不佳,为什么玩家移动速度比相机快?

    我制作了一个游戏 但是当我想添加相机来移动玩家时 它不起作用 玩家移动得比相机快并离开屏幕 我尝试从地形中移除玩家的大小 但没有任何效果 玩家仍然从屏幕中消失 这是我的代码 pygame init scsizeX 600 scsizeY 4
  • 为什么这个数字会加一? [复制]

    这个问题在这里已经有答案了 console log 10209761399365907 为什么此代码输出一个大一的数字 10209761399365908 而不是 10209761399365907 仅此特定号码才会发生这种情况 例如 使用
  • 在sql中按月份名称分组

    我有一张桌子 看起来像 id Item Quantity Amount created 1 Monitor 10 5000 2013 01 11 2 Keyboard 10 200 2013 02 19 3 Monitor 10 5000
  • 在 Scala 2.8 集合中,为什么在 Iterable 之上添加 Traversable 类型?

    我知道那是Traversable 你只需要有一个foreach方法 Iterable需要一个iterator method Scala 2 8 集合 SID 和 Fighting Bitrot with Types 论文基本上都没有提及为什
  • AMPL:对 cplex 使用“timelimit”选项后的结果是否满足所有约束?

    我有一个虚拟问题 我需要知道它的答案 我正在开发一个需要 AMPL 和 CPLEX 作为求解器的项目 现在这个问题一般需要140秒以上才能解决 当我搜索时 我进入了一个名为timelimit 我有价值地使用了这个选项option cplex
  • 类型错误:无法将 datetime.timedelta 与 float 进行比较

    我正在编写 python 脚本来计算开始日期和结束日期之间的持续时间格式 例如20140520160000 and 20140520170000这样我就能得到时间 我在使用这段代码时遇到了问题 if epgDuration gt 0 10
  • 如何正确使用php fopen()

    我正在学习 php 尝试使用fopen 功能 我正在编码的php文件位于这个目录中 domains xxxxx com au public html phpfile php我为要打开的文件指定什么路径 我正在查看的示例基于电脑上的服务器 其
  • 如何在 C 中对单个数字的所有位进行异或?

    有没有一种简单的方法将单个数字的所有位异或在一起 即 C 中的一元异或 具有以下效果的东西 result 0x45 0 1 0 0 0 1 0 1 1 result 0x33 0 0 1 1 0 0 1 1 0 GCC 为此内置了一个 in
  • 大量在线对话文本的情感分析

    标题说明了一切 我有一个 SQL 数据库 其中充满了在线对话文本 我已经用 Python 完成了这个项目的大部分内容 所以我想使用 Python 的 NLTK 库来完成此操作 除非有一个strong不这样做的理由 数据的组织方式为Threa
  • 何时使用 cudaHostRegister() 和 cudaHostAlloc()? “固定或页面锁定”内存是什么意思? OpenCL 中哪些是等效的?

    我刚刚接触 Nvidia 的 API 有些表达对我来说不太清楚 我想知道是否有人可以帮助我了解何时以及如何以简单的方式使用这些 CUDA 命令 更准确地说 在研究如何通过内核并行执行 例如使用 CUDA 来加速某些应用程序时 在某些时候我面
  • 如何在不使用 NSTimer 的情况下在 iPhone 上循环游戏

    为了将我的游戏干净地移植到 iPhone 我正在尝试制作一个不使用 NSTimer 的游戏循环 我在一些示例代码中注意到 如果使用 NSTimer 您需要在开始时使用类似的内容进行设置 self animationTimer NSTimer
  • 匹配核心数据存储中的近似字符串

    我当前正在编写的核心数据应用程序有一个小问题 我有两种不同的模型 上下文和持久存储 一个用于我的应用程序数据 另一个用于包含与我相关的信息的网站 大多数时候 我将应用程序中的一条记录与其他来源的另一条记录完全匹配 然而 有时 我必须回退到模
  • 异常:底层连接已关闭:无法建立 SSL/TLS 安全通道的信任关系

    对于 firebase 通知代码 WebRequest tRequest WebRequest Create https fcm googleapis com fcm send tRequest Method post tRequest C
  • 使用 Dragula 在应用程序中进行 WebDriver 拖放

    我的公司有一个包含拖放功能的新应用程序 拖放是通过 Dragula 库完成的 我正在尝试自动化此功能 但我没有任何运气 我已经尝试过 WebDriver 的内置 DragAndDrop 方法 我的理解是它通常不能很好地与现代网络技术配合使用
  • 将 Parse.com 1.11.0 添加到 watchOS 2

    在 Parse SDK 更新到 1 11 0 中 它表示支持 watchOS 和 tvOS 我想知道如何使用 Cocoapods 将框架添加到我的 watchOS 应用程序中 pod 文件包含pod Parse 我已经跑了pod updat
  • Flexbox 和 vh 高度单位在 IE11 中不兼容吗?

    我正在尝试使用基于 Flexbox 的布局来为我的页面获取粘性页脚 这在 Chrome 和 Firefox 中效果很好 但在 IE11 中 页脚位于我的主要内容之后 换句话说 主要内容不会被拉伸以填充所有可用空间 body border r
  • 在免费/开源软件中使用 OAuth

    我现在正在阅读一些关于OAuth的介绍材料 有想法在免费软件中使用它 我读到了这个 消费者的秘密永远不能被泄露 向任何人透露 不要包含它 在任何请求中 在任何代码中显示它 样本 包括开源 或 任何方式揭示它 如果我使用 OAuth 为特定网
  • 如何在图形中找到三角形?

    这是一个练习算法设计手册 http www algorist com 考虑判断给定的无向图 G 是否为 V E 包含长度为 3 的三角形或环 a 给出一个 O V 3 来查找三角形 如果存在 b 改善 您的算法运行时间为 O V E 你可以