Graph 从最少节点数遍历弱连通图

Graph 从最少节点数遍历弱连通图,graph,traversal,Graph,Traversal,我做了以下练习:有一个无权、有向、弱连通的图,有n个节点(n

我做了以下练习:有一个无权、有向、弱连通的图,有n个节点(n<1000000)。我们希望遍历整个图,从最少的节点开始。问题是:从哪个节点开始遍历?我找不到关于这个特定主题的任何内容。然而,我设法想出了一个算法,但效率不够:

  • 我将图形存储在邻接列表中(对于二维矩阵,n可能太高)
  • 我从每个节点I启动BFS,并将其到达的节点存储在
    x[I][…]
    x=List
  • 我检查是否有
    x[I]。计数==n
  • 我检查是否有任何
    (x[I]并集x[j])。计数==n
  • 我检查是否有任何
    (x[I]并集x[j]并集x[k])。计数==n
    ... 所以我做了所有可能的2,3,4的并集。。。x的子集,并检查其计数是否为n
如果n不是太高,它可以正常工作,但是对于更大的n,我需要一个更有效的算法


非常感谢您的帮助(您会让我再次入睡)!:)

查找没有任何传入边的节点。在这些节点上循环,对于每个节点v,开始遍历图。记住您访问的节点(通过将它们放入哈希表或标记它们)。到达已访问的节点时停止遍历

您需要一个邻接列表表示,其中每个节点都有一个传入边列表和一个传出边列表。然后像这样做:

Set nodesToVisit = emptySet;
for i=1 to n:
    if incoming[i].size() == 0:
        nodesToVisit.add(i)

Set visited = emptySet;
for v in nodesToVisit:
    nodesToVisit.remove(v)
    if(v is not in visited):
        visit(v);
        visited.add(v);
        for u in outgoing[v]:
            nodesToVisit.add(u)