换成栈版顺序会变
补全 dfs_stack:不用递归,自己开一个栈。每次弹出栈顶,没走过就标记、记下,再把它没走过的邻居按 G 里的顺序依次压进去。输出访问顺序——它和递归版不一样。 本节的图:七个点,边 0-1、0-2、1-3、2-4、3-4、5-6;邻接
顺序不同点集合要相同
递归版和栈版都已写好。补全 main:各跑一遍,输出三样:递归版走到几个点 / 栈版走到几个点 / 两边走到的点集合是否相同(相同输出 结果一致,否则输出 结果不一致)。 本节的图:七个点,边 0-1、0-2、1-3、2-4、3-4、5-6
BFS 的走法
第 1 步:从 0 出发,步数 0 第 2 步:第 1 圈:步数 1 第 3 步:第 2 圈:步数 2 第 4 步:圈与圈之间按步数排好 0 1 3 2 4 5 6 0 1 1 2 2 广度优先搜索的走法是【0】。
BFS 何时把点标成走过
BFS 里标记一个点的时机是【0】。
BFS 的访问顺序性质
BFS 的访问顺序满足【0】。
出队才标会有什么后果
把标记从「入队时」挪到「出队时」,后果是【0】。
BFS 从 0 出发的顺序
同一张图,这次用队列一圈一圈扩。运行下面这段程序: 本节的图:七个点,边 0-1、0-2、1-3、2-4、3-4、5-6;邻接表 G 里每个点的邻居按编号从小到大排。 #include <algorithm> #include
写一个 BFS
补全 bfs:用队列,入队的时候就标 visited。输出从 0 出发的访问顺序。 本节的图:七个点,边 0-1、0-2、1-3、2-4、3-4、5-6;邻接表 G 里每个点的邻居按编号从小到大排。 (本题用 g++ -std=c++17
两种标记时机各入队几次
补全 pushes(g, s, mark_on_push):数出一趟 BFS 里一共往队列里放了几次。mark_on_push 为 true 是入队就标,为 false 是出队才标(放邻居时只放还没标过的,出队时发现已经走过就跳过)。两个次
2 号在两种遍历里排第几
DFS 和 BFS 都已写好。补全 main:找出 2 号在两个访问顺序里分别排第几(从 1 数起),用 / 拼起来输出(DFS 在前)。 本节的图:七个点,边 0-1、0-2、1-3、2-4、3-4、5-6;邻接表 G 里每个点的邻居按编