从最少数量的节点弱连接图遍历

时间:2013-03-28 12:15:29

标签: graph traversal

我已经接受了以下练习:有一个没有加权,定向,弱连接的图,有n个节点(n <1 000 000)。我们想要从最少数量的节点开始遍历整个图形。问题是:我从哪个节点开始遍历?我找不到关于这个特定主题的任何内容。但是,我设法提出了一种算法,但效率不高:

  • 我将图形存储在邻接列表中(对于二维矩阵,n可能太高)
  • 我从每个节点i启动BFS,并将其到达的节点存储在x[i][...]x = List<List<int>>
  • 我检查是否有x[i].Count == n
  • 我检查是否有(x[i] union x[j]).Count == n
  • 我检查是否有(x[i] union x[j] union x[k]).Count == n ...所以我制作了所有可能的2个,3个,4个...... x子集的联合,并检查它的计数是否为n。

如果n不是太高,它可以正常工作,但是对于更大的n,我需要一个更有效的算法。

感谢任何帮助(你会让我能够再次入睡)! :)

1 个答案:

答案 0 :(得分:0)

查找没有任何传入边的节点。循环遍历这些节点,并为每个节点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)