python圖的深度優(yōu)先和廣度優(yōu)先算法實例分析
本文實例講述了python圖的深度優(yōu)先和廣度優(yōu)先算法。分享給大家供大家參考,具體如下:
首先有一個概念:回溯
回溯法(探索與回溯法)是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達到目標。但當探索到某一步時,發(fā)現(xiàn)原先選擇并不優(yōu)或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態(tài)的點稱為“回溯點”。
深度優(yōu)先算法:
(1)訪問初始頂點v并標記頂點v已訪問。
(2)查找頂點v的第一個鄰接頂點w。
(3)若頂點v的鄰接頂點w存在,則繼續(xù)執(zhí)行;否則回溯到v,再找v的另外一個未訪問過的鄰接點。
(4)若頂點w尚未被訪問,則訪問頂點w并標記頂點w為已訪問。
(5)繼續(xù)查找頂點w的下一個鄰接頂點wi,如果v取值wi轉(zhuǎn)到步驟(3)。直到連通圖中所有頂點全部訪問過為止。
廣度優(yōu)先算法:
(1)頂點v入隊列。
(2)當隊列非空時則繼續(xù)執(zhí)行,否則算法結(jié)束。
(3)出隊列取得隊頭頂點v;訪問頂點v并標記頂點v已被訪問。
(4)查找頂點v的第一個鄰接頂點col。
(5)若v的鄰接頂點col未被訪問過的,則col入隊列。
(6)繼續(xù)查找頂點v的另一個新的鄰接頂點col,轉(zhuǎn)到步驟(5)。直到頂點v的所有未被訪問過的鄰接點處理完。轉(zhuǎn)到步驟(2)。
代碼:
#!/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)
結(jié)果:
nodes: [1, 2, 3, 4, 5, 6, 7, 8]
廣度優(yōu)先:
[1, 2, 3, 4, 5, 6, 7, 8]深度優(yōu)先:
[1, 2, 4, 8, 5, 3, 6, 7]
更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設計有所幫助。
- 10分鐘教你用python動畫演示深度優(yōu)先算法搜尋逃出迷宮的路徑
- python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實現(xiàn)
- python深度優(yōu)先搜索和廣度優(yōu)先搜索
- Python深度優(yōu)先算法生成迷宮
- Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的廣度優(yōu)先與深度優(yōu)先搜索算法示例
- python數(shù)據(jù)結(jié)構(gòu)之圖深度優(yōu)先和廣度優(yōu)先實例詳解
- python廣度優(yōu)先搜索得到兩點間最短路徑
- python實現(xiàn)廣度優(yōu)先搜索過程解析
- python實現(xiàn)樹的深度優(yōu)先遍歷與廣度優(yōu)先遍歷詳解
相關文章
Python對接PicGo實現(xiàn)圖片自動加水印并上傳操作示例
這篇文章主要為大家介紹了Python對接PicGo實現(xiàn)圖片自動加水印并上傳的操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10
Python的json.loads() 方法與json.dumps()方法及使用小結(jié)
json.loads() 是一個非常有用的方法,它允許你在處理 JSON 數(shù)據(jù)時,將其轉(zhuǎn)換為 Python 數(shù)據(jù)類型,以便于在代碼中進行操作和處理,這篇文章給大家介紹Python的json.loads() 方法與json.dumps()方法及使用小結(jié),感興趣的朋友一起看看吧2024-03-03
如何在sae中設置django,讓sae的工作環(huán)境跟本地python環(huán)境一致
這篇文章主要介紹了如何在sae中設置django,讓sae的工作環(huán)境跟本地python環(huán)境一致,需要的朋友可以參考下2017-11-11

