Algorithm 如何对隐式图使用DFS算法?

Algorithm 如何对隐式图使用DFS算法?,algorithm,graph,pseudocode,depth-first-search,implicit,Algorithm,Graph,Pseudocode,Depth First Search,Implicit,我必须找出隐式图(即顶点数目未知的图)中s和t之间是否存在路径,该图仅由返回与v相邻顶点列表的函数NEXT(v)定义。顶点用自然数标识。对于图的正常表示(邻接列表),我将使用这种DFS算法(伪代码): 对于隐式图,函数NEXT(v)替换数组G.adj[v],假设两者返回相同的内容。我的问题是:如果我不知道所有顶点的总数,如何在开始时将它们涂成白色?然后,如果我发现一个vertice的数字大于标记的容量,我就无法标记它。如果我使用一个列表而不是一个数组,那么如果(G.marked[w]=WHITE

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


对于隐式图,函数
NEXT(v)
替换数组
G.adj[v]
,假设两者返回相同的内容。我的问题是:如果我不知道所有顶点的总数,如何在开始时将它们涂成白色?然后,如果我发现一个vertice的数字大于标记的容量,我就无法标记它。如果我使用一个列表而不是一个数组,那么如果(G.marked[w]=WHITE)不在列表中搜索,我就无法检查

使用哈希两个集合,一个用于灰色节点,一个用于黑色NOE。如果节点既不在其中,则为白色。伪代码:

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
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
现在,无论何时将节点着色为灰色,将其放入
灰色节点
,当将其着色为黑色时,将其从
灰色节点
中取出并放入
黑色节点

这里有一个更好的版本,只需少调用一个
contains()
calls:

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

我对哈什不太实际。你能解释得更清楚些吗?悲观的选民能告诉我这个答案有什么问题吗?我的答案解决了你的问题吗?如果没有,还有什么尚不清楚?堆呢?它们能有效地替代散列吗?为什么要使用堆,优先级是多少?我原以为堆可以缩短搜索时间,但现在我不太确定