首先有一個概念:回溯node
回溯法(探索與回溯法)是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步從新選擇,這種走不通就退回再走的技術爲回溯法,而知足回溯條件的某個狀態的點稱爲「回溯點」。python
深度優先算法:算法
(1)訪問初始頂點v並標記頂點v已訪問。
(2)查找頂點v的第一個鄰接頂點w。
(3)若頂點v的鄰接頂點w存在,則繼續執行;不然回溯到v,再找v的另一個未訪問過的鄰接點。
(4)若頂點w還沒有被訪問,則訪問頂點w並標記頂點w爲已訪問。
(5)繼續查找頂點w的下一個鄰接頂點wi,若是v取值wi轉到步驟(3)。直到連通圖中全部頂點所有訪問過爲止。app
廣度優先算法:spa
(1)頂點v入隊列。
(2)當隊列非空時則繼續執行,不然算法結束。
(3)出隊列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。
(4)查找頂點v的第一個鄰接頂點col。
(5)若v的鄰接頂點col未被訪問過的,則col入隊列。
(6)繼續查找頂點v的另外一個新的鄰接頂點col,轉到步驟(5)。直到頂點v的全部未被訪問過的鄰接點處理完。轉到步驟(2)。code
代碼:blog
#!/usr/bin/python # -*- coding: utf-8 -*- class Graph(object): def __init__(self,*args,**kwargs): self.node_neighbors = {} self.visited = {} def add_nodes(self,nodelist): for node in nodelist: self.add_node(node) def add_node(self,node): if not node in self.nodes(): self.node_neighbors[node] = [] def add_edge(self,edge): u,v = edge if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]): self.node_neighbors[u].append(v) if(u!=v): self.node_neighbors[v].append(u) def nodes(self): return self.node_neighbors.keys() def depth_first_search(self,root=None): order = [] def dfs(node): self.visited[node] = True order.append(node) for n in self.node_neighbors[node]: if not n in self.visited: dfs(n) if root: dfs(root) for node in self.nodes(): if not node in self.visited: dfs(node) print order return order def breadth_first_search(self,root=None): queue = [] order = [] def bfs(): while len(queue)> 0: node = queue.pop(0) self.visited[node] = True for n in self.node_neighbors[node]: if (not n in self.visited) and (not n in queue): queue.append(n) order.append(n) if root: queue.append(root) order.append(root) bfs() for node in self.nodes(): if not node in self.visited: queue.append(node) order.append(node) bfs() print order return order if __name__ == '__main__': g = Graph() g.add_nodes([i+1 for i in range(8)]) g.add_edge((1, 2)) g.add_edge((1, 3)) g.add_edge((2, 4)) g.add_edge((2, 5)) g.add_edge((4, 8)) g.add_edge((5, 8)) g.add_edge((3, 6)) g.add_edge((3, 7)) g.add_edge((6, 7)) print "nodes:", g.nodes() order = g.breadth_first_search(1) order = g.depth_first_search(1)
結果:隊列
nodes: [1, 2, 3, 4, 5, 6, 7, 8]utf-8
廣度優先:
[1, 2, 3, 4, 5, 6, 7, 8]it
深度優先:
[1, 2, 4, 8, 5, 3, 6, 7]