dfs用栈、bfs用队列、dijkstra用优先队列,都是图遍历,都要有个visited[]数组。dijkstra常用dist[]替代visited[]功能。
-
bfs在入队前设置
visited[],这样当两个节点指向同一个节点时,可防止那个节点重复入队。若在出队后设置visited[],会重复入队,但只要一出队就作visited[x]判重,也没问题。 -
dfs一样在入栈前设置
visited[]可防止重复入栈。若在出栈后设置visited[],只要一出栈就作visited[x]判重,也没问题。 -
dfs的递归写法是,在递归前判重,在函数开头只设置
visited[x],这对应于入栈前设置visited[]的情况。或者在函数开头就判重退出,并设置visited[x],然后不用判断直接递归,这对应于出栈后设置visited[]的情况。 -
dijkstra因为距离值会更新,要允许节点重复入队,所以在出队后设置
visited[]。可用dist[]数组代替visited[]功能,当newdist<dist[v]时相当于在说v未访问,插入(newdist,v)元组。pq中已有v点会重复插入较小距离,这没关系,因为原先的较大值在后面运行时不再满足newdist<dist[v],从而跳过。
树是一种特殊的图,dfs(前序、中序、后序遍历)、bfs(按层遍历)都不用visited[]数组。该图没有dijkstra遍历。