当前位置: 首页 > 知识库问答 >
问题:

图-如何找到最小有向循环(最小总权重)?

阎涵忍
2023-03-14

这是我的算法。

我做了一个DFS。每次当我找到back edge时,我都知道我得到了一个有向循环。

然后我将暂时沿着父数组向后(直到我在循环中遍历所有顶点),并计算总权重

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

共有1个答案

孙帅
2023-03-14

你可以在这里使用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)
 类似资料:
  • 我在NetworkX中有一个有向无环简单图。 现在,对于每个边,该边都有一个“源”和一个“目标”。如果除了这个边之外,还有一条从“源”到“目标”的路径,那么我想删除这个边。 null > 节点为: 边缘是:

  • 嗨,我在纠结这个问题。其内容如下: 首先,我们如何知道图中有多少个循环,以及如何检查这些循环? 还有,为什么是evlogv?根据我的理解,你应该遍历所有的顶点,因此使它成为vlogv。 这是我个人的学习,所以如果任何人有一个例子,他们可以使用,它将大大帮助我!我并不是真的在寻找伪代码--只是一个通用算法来理解如何使用从一个节点到所有节点的最短路径来帮助我们解决这个问题。谢谢你!

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

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

  • 我在这里要问的问题以前在堆栈溢出中已经被问过了。但我无法正确理解Skiminok发布的解决方案。 这是链接。 我尝试了上面链接上发布的解决方案,并给出了两个示例测试用例,但我无法得到正确的答案。 对于测试用例 1:: N=3 和 K=2 5 4 7 DAG将会是: 注:我构建上述DAG时考虑到: 设pi和pj是两个不同的问题。然后,我们将从pi到pj绘制一条有向边,当且仅当pj可以在pi之后的同一