圖的深度優先搜尋(depth first search),和樹的先序遍歷比較類似。
它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有其他頂點未被訪問到,則另選乙個未被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。
顯然,深度優先搜尋是乙個遞迴的過程。
廣度優先搜尋演算法(breadth first search),又稱為"寬度程式設計客棧優先搜尋"或"橫向優先搜尋",簡稱bfs。
它的思想是:從圖中某頂點v出發,在訪問了vfdpjtmmw之後依次訪問v的各個未曾訪問過的鄰接點,然後分別從這些鄰程式設計客棧接點出發依次訪問它們的鄰接點,並使得「先被訪問的頂點的鄰接點先於後被訪問的頂點的鄰接點被訪問,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。如果此時圖中尚有頂點未被訪問,則需要另選乙個未曾被訪問過的頂點作為新的起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。
換句話說,廣度優先搜尋遍歷圖的過程是以v為起點,由近至遠,依次訪問和v有路徑相通且路徑長度為1,2...的頂點。
# -*- coding: utf-8 -*-
"""created on wed sep 27 00:41:25 2017
@author: my
"""from collections import ordereddict
class graph:
nodes=ordereddict({})#有序字典
def tostring(self):
for key in self.nodes:
print key+'鄰接點為'+str(self.nodes[key].adj)
def add(self,data,adj,tag):
n=node(data,adj)
self.nodes[tag]=n
for vtag in n.adj:
if self.nodes.has_key(vtag) and tag not in self.nodes[vtag].adj:
self.nodes[vtag].adj.append(tag)
visited=
def dfs(self,v):
if v not in self.visited:
self.visited.append(v)
print v
for adjtag in self.nodes[v].adj:
self.dfs(adjtag)
visited2=
def bfs(self,v):
queue=
qu程式設計客棧eue.insert(0,v)
self.visited2.append(v)
while(len(queue)!=0):
top=queue[len(queue)-1]
for temp in self.nodes[top].adj:
if temp not in self.visited2:
self.visited2.append(temp)
queue.insert(0,temp)
print top
queue.pop()
class node:
data=0
adj=
def __init__(self,data,adj):
self.data=data
self.adj=adj
g=graph()
g.add(0,['e','c'],'a')
g.add(0,['a','g'],'b')
g.add(0,['a','e'],'c')
g.add(0,['a','f'],'d')
g.add(0,['a','c','f'],'e')
g.add(0,['d','g','e'],'f')
g.add(0,['b','f'],'g')
g.tostring()
print '深度優先遍歷的結構為'
g.dfs('c')
print '廣度優先遍歷的結構為'
g.bfs('c')
本文標題: python深度優先搜尋和廣度優先搜尋
本文位址: /jiaoben/python/219944.html
深度優先搜尋和廣度優先搜尋
深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...
廣度優先搜尋和深度優先搜尋
dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...
深度優先搜尋和廣度優先搜尋
定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...