如何将DFS算法用于隐式图?

时间:2016-07-11 08:17:20

标签: algorithm graph pseudocode depth-first-search implicit

我必须找出隐式图中s和t之间是否存在路径,即具有未知顶点数的图,仅由函数NEXT(v)定义,该函数返回邻近的顶点列表v。顶点用自然数标识。使用图的正常表示(邻接列表),我将使用这种DFS算法(伪代码):

DFS(G: Graph, s: Natural, t: Natural) : Boolean

    for v = 0 to G.adj.length - 1 do
        G.marked[v] = WHITE
    VISIT(G, s)
    if (G.marked[t] = WHITE) then return FALSE
    else return TRUE


VISIT(G: Graph, v: Natural)

    G.marked[v]  = GREY
    for each w : G.adj[v]
        if (G.marked[w] = WHITE)
            VISIT(G, w)
    G.marked[v] = BLACK

使用隐式图,函数NEXT(v)替换数组G.adj[v],因为它们都返回相同的内容。我的问题是:如果我不知道他们的总数,如何在开头所有顶点着色白色?然后,如果我发现一个数字大于marked容量的顶点,我就无法标记它。如果我使用列表而不是数组,那么如果没有在列表中搜索,我就无法检查if (G.marked[w] = WHITE)(这是浪费时间)。

1 个答案:

答案 0 :(得分:1)

使用散列两个集合,一个用于灰色节点,一个用于黑色噪声。如果两个节点都不是,则为白色。伪代码:

grey_nodes = new hash_set()
black_nodes = new hash_set()

if !grey_nodes.contains(v) and !black_nodes.contains(v)
    // do white stuff
else if grey_nodes.contains(v)
    // do grey stuff
else
    // do black stuff

现在,无论何时将节点着色为灰色,请将其放入grey_nodes,当您将其着色为黑色时,请将其从grey_nodes中取出并放入black_nodes

这是一个更好的版本,只有少量contains()次来电:

grey_nodes = new hash_set()
black_nodes = new hash_set()

if grey_nodes.contains(v)
    // do grey stuff
else if black_nodes.contains(v)
    // do black stuff
else
    // do white stuff