bfs记录路径 2020-04-12 by junhao·0评论 参加https://stackoverflow.com/questions/8922060/how-to-trace-the-path-in-a-breadth-first-search 向队列中push path(arraylist<>), 访问节点时,取出当前path的最后一个
dfs 2020-02-25 by junhao·0评论 记录路径。用ArrayList记录已经访问过的节点,轮到当前节点时,vis.add(thisNode),接着再dfs函数末尾vis.remove(vis.size() – 1), 从而在访问当前节点后移出访问记录 如果存在多条路径可以到达某个点的话,dfs最终会多次到达那个点,哪怕使用了vis,因为vis只是防止此次dfs时不 dfs回去。 因此,若某个点其实只需要遍历一次就够了,可再标记一下这个点曾被访问过。
bfs 2020-02-23 by junhao·0评论 bfs中vis[x][y]=1应该在处理当前点时进行,而不是一添加到队列中就标记。 情况如下: 1 2 3 4 5 6 从1开始时,2、4都被加入到第二步的选择们中,接着访问2时,2将5加入到第三步的选择们中,如果5一加入队列就就标记,那么在第二步选择4时,对4来说第三步就不能是5了。因此是在处理当前节点时,即进行到第n+1步是才标记以防影响第n步的选择。 同时使用优先队列的话priority_queue<node,vector<node>,greater<node>> q,让当前步骤中,权值小的排在前面,这样在访问这个最优节点后,由于标记了vis,这样之后就不会访问当前步骤中其他权值大的节点,从而实现了选择。由于每一步都只访问了最优解,则下一步的所有选择都是基于最优解之上的,则下一步的所有选择的权值都是大于当前最优解的权值,因此在优先队列中下一步骤的选择们不会影响当前步骤选择们的顺序。