DFS和一个堆栈

时间:2012-03-10 23:03:20

标签: algorithm graph depth-first-search

我在业余时间学习CS算法并且已经相当顺利,但是我无法理解邻接矩阵和DFS。

010100
101100
010110
111000
001001
000010

如果以上是无向图,则有6个顶点(a,f)(第1行是顶点a等)如果图形是使用DFS和堆栈遍历,则从顶点a开始。

每次插入或移除顶点后,队列的内容是什么?我假设如果同时插入2个,则按字母顺序排列。

有人可以解释如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

你在a,所以你的行是010100,你的邻居是bd。所以把它们放在堆栈上(你已经访问过a):

[d b]                  {a}

pop d,将其添加到受访节点集,然后访问 - 111000abc)(但是你已访问a):

[c b b]                {a d}

pop c,将其添加到受访节点集,然后访问 - 010110bde)(但我们已访问d):

[e b b b]              {a d c}

pop e,将其添加到受访节点集,然后访问 - 001001cf)(但我们已访问过c }):

[f b b b]              {a d c e}

pop f,将其添加到受访节点集,然后访问那里 - 000010e)(但我们已经访问过那里):

[b b b]                {a d c e f}

pop b,将其添加到受访节点集,然后访问 - 101100acd)(但我们已经访问了所有这些):

[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}

其中bc添加在“右”而不是“左”(但我们仍然从左边开始,所以我们探索广度,下一个节点将是b)。

答案 1 :(得分:2)

作为andrew cooke的一个很好的答案的附录,您可以使用python库networkx来实际可视化DFS搜索!默认情况下,DFS从节点0开始,但可以更改。您可以在开头修改图形以显示更复杂的系统。

enter image description here

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()