我必须找出隐式图中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)
(这是浪费时间)。
答案 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