我在业余时间学习CS算法并且已经相当顺利,但是我无法理解邻接矩阵和DFS。
010100
101100
010110
111000
001001
000010
如果以上是无向图,则有6个顶点(a,f)(第1行是顶点a等)如果图形是使用DFS和堆栈遍历,则从顶点a开始。
每次插入或移除顶点后,队列的内容是什么?我假设如果同时插入2个,则按字母顺序排列。
有人可以解释如何解决这个问题吗?
答案 0 :(得分:4)
你在a
,所以你的行是010100
,你的邻居是b
,d
。所以把它们放在堆栈上(你已经访问过a
):
[d b] {a}
pop d
,将其添加到受访节点集,然后访问 - 111000
(a
,b
,c
)(但是你已访问a
):
[c b b] {a d}
pop c
,将其添加到受访节点集,然后访问 - 010110
(b
,d
,e
)(但我们已访问d
):
[e b b b] {a d c}
pop e
,将其添加到受访节点集,然后访问 - 001001
(c
,f
)(但我们已访问过c
}):
[f b b b] {a d c e}
pop f
,将其添加到受访节点集,然后访问那里 - 000010
(e
)(但我们已经访问过那里):
[b b b] {a d c e f}
pop b
,将其添加到受访节点集,然后访问 - 101100
(a
,c
,d
)(但我们已经访问了所有这些):
[b b] {a d c e f b}
我们已经访问了b,所以弹出并丢弃了两次。
[] {a d c e f b}
ps它是DFS,所以它是一个堆栈,而不是一个队列(你在问题中都提到了)。对于BFS,它会类似但你追加到队列中,所以前几个步骤是:
[d b] {a}
[b b c] {a d}
其中b
和c
添加在“右”而不是“左”(但我们仍然从左边开始,所以我们探索广度,下一个节点将是b
)。
答案 1 :(得分:2)
作为andrew cooke的一个很好的答案的附录,您可以使用python库networkx
来实际可视化DFS搜索!默认情况下,DFS从节点0开始,但可以更改。您可以在开头修改图形以显示更复杂的系统。
import numpy as np
import networkx as netx
import pylab as plt
# Reshape the input string into a numpy array then a graph
A = np.array(map(int,"010100101100010110111000001001000010")).reshape(6,6)
G = netx.Graph(A)
# Compute the DFS tree
T = netx.dfs_tree(G)
# Show the edges traversed
print list(netx.dfs_edges(G))
# Plot the original graph
plt.subplot(121)
pos = netx.circular_layout(G)
netx.draw(G,pos,node_color='w',node_size=800)
netx.draw_networkx_nodes(G,pos,nodelist=[0],node_color='r',node_size=800)
# Plot the result of the DFS
plt.subplot(122)
pos = netx.circular_layout(T)
netx.draw(T,pos,node_color='w',node_size=800)
netx.draw_networkx_nodes(T,pos,nodelist=[0],node_color='r',node_size=800)
plt.show()