当前位置: 首页 > 面试题库 >

图表-如何找到最小定向循环(最小总重量)?

南宫书
2023-03-14
问题内容

这是消费税:

令G为具有n个顶点和m个边的加权有向图,其中所有边的权重为正。有向循环是有向路径,该路径在相同的顶点处开始和结束,并包含至少一条边。给出一个O(n ^
3)算法,以找到最小总重量的G中的有向循环。对于O((n ^ 2)* m)算法,将给予部分功劳。

这是我的算法。

我做一个DFS。每当我找到一个时back edge,我就知道我有一个定向循环。

然后,我将暂时沿前进parent array(直到我遍历循环中的所有顶点)并计算total weights

然后,我total weight将此循环的与进行比较minmin始终采用最小的总重量。DFS完成后,还会找到我们的最小定向周期。

好吧,那么关于时间的复杂性。

老实说,我不知道算法的时间复杂度。

对于DFS,遍历采用O(m +
n)(如果m是边的数量,而n是顶点的数量)。对于每个顶点,它可能指向其祖先之一,因此形成一个循环。找到一个周期后,需要O(n)来汇总总权重。

所以我认为总时间为O(m + n * n)。但是很显然这是错误的,正如消费税中所述,最佳时间是O(n ^ 3),而正常时间是O(m * n ^ 2)。

谁能帮助我:

  1. 我的算法正确吗?
  2. 如果我的算法正确,那么时间复杂度是多少?
  3. 有没有更好的算法可以解决这个问题?

问题答案:

您可以在此处使用Floyd-
Warshall
算法。

Floyd-Warshall算法可以找到 所有 顶点 之间的最短路径。

该算法则很简单,去了所有对(u,v),并
找到一对最小化dist(u,v)+dist(v,u),因为这对上一周期表示从uu与重量dist(u,v)+dist(v,u)。如果该图还允许自环(边(u,u)),则您还需要单独检查它们,因为算法没有检查这些循环(并且只有它们)。

代码

run Floyd Warshall on the graph
min <- infinity
vertex <- None
for each pair of vertices u,v
    if (dist(u,v) + dist(v,u) < min):
           min <- dist(u,v) + dist(v,u)
           pair <- (u,v)
return path(u,v) + path(v,u)

path(u,v) + path(v,u) 实际上是从u到v,然后从v到u的路径,这是一个循环。

算法运行时间为O(n^3),因为floyd-warshall是瓶颈,因为循环需要O(n^2)时间。

我认为这里的正确性是微不足道的,但是如果您不同意我的话,请告诉我,我会尽力向您解释。



 类似资料:
  • 这是我的算法。 我做了一个。每次当我找到时,我都知道我得到了一个有向循环。 然后我将暂时沿着向后(直到我在循环中遍历所有顶点),并计算。 我的算法正确吗? 如果我的算法正确,时间复杂度是多少? 这个问题有没有更好的算法?

  • 我试图在N大小的数组的k个元素中找到最小和次最小的元素(没有排序和最小/最大堆)。 使用传统的方法,首先从第< code>0个元素开始,在第< code>k个元素中找到最小的和第二小的元素,然后将起始点移动< code>1并重复该过程。但是它的复杂度是< code>O(Nk)。如果可能,我需要一个复杂度为< code>O(N)的解决方案。对此有什么建议吗? 在Jubobs的注释后编辑:例如,如果s

  • 我有一组向量,我需要用java编写算法,找到这个集合的最小元素。问题是,有些元素是无与伦比的。例如minset{(1,4,6),(3,2,5),(2,3,4),(5,4,6)} = {(1,4,6),(3,2,5),(2,3,4)}。对于最小元素集“minset”,以下内容成立:原始集的每个向量要么在“minset”中,要么在“minset”中

  • 我有一个任务需要完成:

  • 我在NetworkX中有一个有向无环简单图。 现在,对于每个边,该边都有一个“源”和一个“目标”。如果除了这个边之外,还有一条从“源”到“目标”的路径,那么我想删除这个边。 null > 节点为: 边缘是:

  • 问题内容: 我正在使用Ubuntu 11.04。如何找出进程的最大调用堆栈大小以及堆栈中每个帧的大小? 问题答案: 您可以使用查询最大进程和堆栈大小。堆栈框架没有固定的尺寸。它取决于每个帧需要多少本地数据(即本地变量)。 要在命令行上执行此操作,可以使用ulimit。 如果要为正在运行的进程读取这些值,我不知道执行此操作的任何工具,但是查询/ proc文件系统很容易:

  • 本文向大家介绍如何找到R中向量的最小值和最大值的索引?,包括了如何找到R中向量的最小值和最大值的索引?的使用技巧和注意事项,需要的朋友参考一下 在分析项目中进行数据探索时,有时我们需要找到一些值的索引,主要是最小值和最大值的索引,以检查相应的数据行是否包含一些关键信息,或者我们可能会忽略它。此外,如果我们不想忽略它们,有时会根据数据特征将这些值转换为另一个值。 示例

  • 我正在编写一个代码,用户会被问到:“有多少个标记?”然后他们输入他们提到的分数。然后,它打印出最大标记和最小标记。 我不是最擅长编码的,所以我没有方向去寻找循环中的最大值和最小值。我找到了他们能够输入标记的部分,但我不确定如何找到最大值和最小值。我查找了如何进行最大值和最小值,但它通常显示为在数组中查找最大值和最小值,这不是我想要做的。