圖的遍歷
對圖的搜尋就是對圖中頂點的遍歷。圖中各頂點的關係比較複雜、乙個頂點可能有多
個鄰接頂點,也可能是獨立頂點(非連通圖)。為了不重複地訪問所有頂點,需設立乙個訪
問標誌陣列visited,並置其初值為false(未被訪問)。遍歷時只訪問那些未被訪問過的
頂點,且在訪問後,將其訪問標誌的值改為true。當所有頂點訪問標誌的值都為
true,則圖已遍歷。遍歷一般從圖的第1 個頂點開始。確定遍歷頂點有兩個搜尋原則:
深度優先搜尋和廣度優先搜尋。
深度優先搜尋
演算法7.4、7.5 是利用遞迴對圖進行深度優先搜尋的演算法,它的主要思想是:先訪問圖
的第1 個頂點,然後訪問這個頂點的第1 個鄰接頂點,再訪問第1 個鄰接頂點的第1 個鄰接
頂點。如果這個頂點被訪問過了,就訪問第2 個鄰接頂點,⋯⋯ 所謂第1 個鄰接頂點、第
2 個鄰接頂點不是由圖的拓撲關係決定的,它取決於圖的儲存結構。即使是同乙個圖,如果
它的儲存結構不同,那麼它的某個頂點的第1 個鄰接頂點、第2 個鄰接頂點也可能不同。關
於這一點,將在後面algo7-10.cpp、algo7-11.cpp 中根據例項做進一步的說明。演算法7.4、
7.5 是基於基本操作的,與圖的具體儲存結構無關,所以很容易移植到各種儲存結構中,只
要那種儲存結構的有關基本操作函式存在即可。在bo7-1.cpp~bo7-4.cpp 中都有實現演算法
7.4 和演算法7.5 的函式。
廣度優先搜尋
演算法7.6 是對圖進行廣度優先搜尋的演算法,它的主要思想是:先訪問圖的第1 個頂
點,然後依次訪問這個頂點的所有鄰接頂點,再依次訪問這些鄰接頂點的所有鄰接頂點。
這需要建立1 個先進先出的佇列,依次將訪問過的頂點入隊。當前1 個頂點的所有鄰接頂
點都被訪問了,就出隊1 個頂點,再訪問這個頂點的所有鄰接頂點且將它們入隊。直至所
有頂點都被訪問過。演算法7.6 也是基於基本操作的,在bo7-1.cpp~bo7-4.cpp 中也都有實
現演算法7.6 的函式。algo7-10.cpp 是在鄰接矩陣的儲存結構下,呼叫演算法7.4、7.5 和
7.6,對圖進行深度優先搜尋和廣度優先搜尋的程式。
// algo7-10.cpp 檢驗深度優先和廣度優先的程式(鄰接矩陣儲存結構)**的執行結果:#include"c1.h"
#define max_name 5 // 頂點字串的最大長度+1
#define max_info 20 // 相關資訊字串的最大長度+1
typedef int vrtype; // 頂點關係型別
typedef char infotype; // 相關資訊型別
typedef char vertextype[max_name]; // 頂點型別
#include"c7-1.h" // 鄰接矩陣儲存結構
#include"bo7-1.cpp" // 鄰接矩陣儲存結構的基本操作
void visit(vertextype i)
void main()
請輸入資料檔名(f7-1.txt或f7-2.txt):f7-1.txt
8個頂點14條邊或弧的無向圖。頂點依次是: a b c d e f g h
g.arcs.adj:
0 1 1 0 1 1 1 1
1 0 0 1 1 0 0 1
1 0 0 0 0 0 1 1
0 1 0 0 0 0 0 1
1 1 0 0 0 1 0 0
1 0 0 0 1 0 1 0
1 0 1 0 0 1 0 0
1 1 1 1 0 0 0 0
g.arcs.info:
頂點1(弧尾) 頂點2(弧頭) 該邊或弧的資訊:
深度優先搜尋的結果:
a b d h c g f e
修改頂點的值,請輸入原值新值: e e
刪除一條邊或弧,請輸入待刪除邊或弧的弧尾弧頭:a b
廣度優先搜尋的結果:
深度優先和廣度優先
在爬蟲系統中,待抓取url佇列是很重要的一部分,待抓取url佇列中的url以什麼樣的順序排隊列也是乙個很重要的問題,因為這涉及到先抓取哪個頁面,後抓取哪個頁面。而決定這些url排列順序的方法,叫做抓取策略。下面是常用的兩種策略 深度優先 廣度優先 注 scrapy預設採用的是深度優先演算法 這裡是深...
深度優先 廣度優先
父類定義 class people def init self,name,age,weight self.name name self.age age self.weight weight defspeak self print s 說 我 d 歲。self.name,self.age 單繼承示例 ...
深度優先和廣度優先區別
一 深度優先搜尋的特點是 1.深度優先搜尋法有遞迴以及非遞迴兩種設計方法。一般的,當搜尋深度較小 問題遞迴方式比較明顯時,用遞迴方法設計好,它可以使得程式結構更簡捷易懂。當資料量較大時,由於系統堆疊容量的限制,遞迴容易產生溢位,用非遞迴方法設計比較好。2.深度優先搜尋方法有廣義和狹義兩種理解。廣義的...