python深度優先搜尋和廣度優先搜尋

2022-09-28 09:30:12 字數 2164 閱讀 2686

圖的深度優先搜尋(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...