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

2021-08-28 03:54:29 字數 2386 閱讀 7989

定義:圖(graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:g(v,e),其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.

簡單點的說:圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。

如二叉樹就為乙個簡單的圖:

廣度優先搜尋演算法(breadth first search,bsf),思想是:

換句話說,廣度優先搜尋遍歷圖的過程是以v為起點,由近至遠,依次訪問和v有路徑相通且路 徑長度為1,2...的頂點。

如上圖的bfs訪問順序為:

a->b->c->d->e->f

圖的深度優先搜尋(depth first search, dfs),和樹的前序遍歷非常類似。

它的思想:

如上圖的bfs訪問順序為:

a->b->d->e->c->f

# -*- coding: utf-8 -*-

#/usr/bin/python

from collections import deque

import sys

class graph(object):

def __init__(self, *args, **kwargs):

self.order = #visited order

self.neighbor = {}

def add_node(self, node):

key,val = node

if not isinstance(val, list):

print('node value should be a list')

#sys.exit('failed for wrong input')

self.neighbor[key] = val

def broadth_first(self, root):

if root != none:

search_queue = deque()

visited =

else:

print('root is none')

return -1

while search_queue:

person = search_queue.popleft()

if (not person in visited) and (person in self.neighbor.keys()):

search_queue += self.neighbor[person]

def depth_first(self, root):

if root != none:

search_queue = deque()

visited =

else:

print('root is none')

return -1

while search_queue:

person = search_queue.popleft()

if (not person in visited) and (person in self.neighbor.keys()):

tmp = self.neighbor[person]

tmp.reverse()

for index in tmp:

def clear(self):

self.order =

def node_print(self):

for index in self.order:

print(index, end=' ')

if __name__ == '__main__':

g = graph()

g.add_node(('1',['one', 'two','three']))

g.add_node(('one',['first','second','third']))

g.add_node(('two',['1','2','3']))

g.broadth_first('1')

print('broadth search first:')

print(' ', end=' ')

g.node_print()

g.clear()

print('\n\ndepth search first:')

print(' ', end=' ')

g.depth_first('1')

g.node_print()

print()

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

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

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

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...

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

深度優先搜尋 可以用這個圖來很好的幫助我們理解dfs,dfs是一種列舉所有完整路徑來遍歷所有情況的搜尋方法,可以使用遞迴來很好的實現dfs,遞迴式可以理解為 解決的典型問題給定乙個序列,列舉這個序列的所有子串行,從中選擇乙個某方面最優的子串行。也可以簡化理解為列舉從n個整數中選擇k個數的所有方案 具...