定義:圖(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個數的所有方案 具...