檢驗深度優先和廣度優先的程式 鄰接矩陣儲存結構

2022-08-29 12:15:09 字數 2157 閱讀 6031

圖的遍歷

對圖的搜尋就是對圖中頂點的遍歷。圖中各頂點的關係比較複雜、乙個頂點可能有多

個鄰接頂點,也可能是獨立頂點(非連通圖)。為了不重複地訪問所有頂點,需設立乙個訪

問標誌陣列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.深度優先搜尋方法有廣義和狹義兩種理解。廣義的...