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

无向图中的返回顶点

澹台权
2023-03-14

我试图在Python中提出一种贪婪的算法,该算法在给定某个起始顶点的情况下返回无向图中的顶点。我知道DFS确定是否存在循环,但我正在尝试实际返回形成循环的顶点。我使用邻接矩阵来表示下图:

adjacencyMatrix = [[0, 1, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 1, 0]]

从图学上讲,这是一个由单个循环组成的无向图。

我当前的思想过程是将起始索引设置为我遇到的第一个<code>1)。然后我会查看行的其余部分,看看是否有另一个<code>1</code>存在,因为这意味着我的当前顶点连接到该索引。然而,我不能完全确定(a)这是正确的方法,以及(b)如何“移动”到下一个顶点。例如,如何导航嵌套的<code>For顶点移动到<code>相邻矩阵[0][2]

编辑我想出的这个解决方案似乎对我尝试的几幅图有效:

def findCycle(matrix):
    visited = list()
    cycleNotFound = True
    row = 0
    col = 0
    startVertex = (0, 0)

    while cycleNotFound:

        # Only add a vertex if it has not already been visited
        if (matrix[row][col] == 1) and ((row, col) not in visited):
            # Set the startVertex when the first node is found
            if len(visited) == 0:
                startVertex = (row, col)

            # Add the current vertex and its counter part
            visited.append((row, col))
            visited.append((col, row))

            # If row and col are equal, infite loop will get created
            if row != col:
                row = col
                col = 0
            else:
                row += 1

        # If back at starting point, break look
        elif ((row, col) == startVertex) and (len(visited) > 1):
            cycleNotFound = False
            visited.append(startVertex)

        # Else, continue to look for unvisted neighbors
        else:
            col += 1

    return visited

if __name__ == "__main__":
    matrix = [[0, 1, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 1, 0]]
    cycle = findCycle(matrix)
    index = 0
    # Print the vertices.  Only print even vertices to avoid duplicates.
    while (index < len(cycle)):
        print cycle[index]
        index += 2

这并不是最优雅的解决方案,我确信需要进行一些重大的重构。

共有1个答案

冷越泽
2023-03-14

你可以试试这个:

def findCycle(node):
    cycle = stack()
    if( DFS(node, cycle) ):
        return cycle
    return None

def DFS(node, cycle):
    cycle.append(node)
    mark node as visited
    foreach node.neighbors as neighbor:
        if neighbor already visited:
            return true
        else:
            if( DFS(neighbor, cycle) ) return true
    cycle.remove(node)
    return false
 类似资料:
  • BackTop 返回顶部 1.3.0 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ √ √ √ √ 基本使用 由于返回顶部需要实时监听滚动条的位置,从而判断返回的按钮该出现还是隐藏,由于组件无法得知页面的滚动条信息,只能在页面的onPageScroll生命周期 中获得滚动条的位置,故需要在页面监听onPageScroll生命周期,实时获得滚动

  • 我有一张室内地图上的无向位置图。当给定一组顶点时,我要找到覆盖所有这些顶点的最短路径。图形包含52个顶点和150-250条边。 我能用什么最好的算法来找到最短的路径。请不要混淆这是一个旅行推销员的问题。它不需要覆盖所有节点,只需要覆盖给定的节点集。

  • 在无向赋权图中寻找两个顶点之间的最短路径。还已知权重是小于log(logV)的整数,其中V是顶点的数量。使用贝尔曼-福特或Dijkstra算法很容易解决,但是有没有什么算法可以更快地解决呢? 到目前为止,我一直在考虑使用BFS,将权重大于1的边划分成两个权重为1的边,但如果V是大数,就不是一个好主意。不,这不是我的家庭作业,我只是在想。

  • 我有城市的位置,我把城市当作顶点。我想创建无向图,以便以后计算最短路径树。我的问题是如何首先为城市创建无向图?

  • 我有一个问题,我需要找到最长的路径。给出一个揭开的无向图。从一个给定的顶点开始,我需要访问尽可能多的顶点,并在同一个顶点完成,而不是访问每一个顶点超过一次。 我发现的大多数算法都是针对特殊情况的(无环的,有向的等等)。一个想法可以是为每个顶点子集找到哈密顿循环(子集可以通过回溯生成)。但我想一定有更好的算法。

  • 本文向大家介绍javascript中返回顶部按钮的实现,包括了javascript中返回顶部按钮的实现的使用技巧和注意事项,需要的朋友参考一下 炫酷的返回顶部功能 js核心代码 html 以上所述就是本文的全部内容了,希望大家能够喜欢。