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

圖的遍歷
對圖的搜索就是對圖中頂點的遍歷。圖中各頂點的關係比較複雜、一個頂點可能有多
個鄰接頂點,也可能是獨立頂點(非連通圖)。爲了不重複地訪問所有頂點,需設立一個訪
問標誌數組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)
{
	printf("%s ",i);
}
void main()
{
	MGraph g;
	VertexType v1,v2;
	CreateFUDG(g); // 利用數據文件創建無向圖,在bo7-1.cpp中
	Display(g); // 輸出無向圖,在bo7-1.cpp中
	printf("深度優先搜索的結果:\n");
	DFSTraverse(g,visit); // 在bo7-1.cpp中
	printf("修改頂點的值,請輸入原值新值: ");
	scanf("%s%s",v1,v2);
	PutVex(g,v1,v2); // 在bo7-1.cpp中
	printf("刪除一條邊或弧,請輸入待刪除邊或弧的弧尾弧頭:");
	scanf("%s%s",v1,v2);
	DeleteArc(g,v1,v2); // 在bo7-1.cpp中
	printf("廣度優先搜索的結果:\n");
	BFSTraverse(g,visit); // 在bo7-1.cpp中
}

代碼的運行結果:
請輸入數據文件名(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
廣度優先搜索的結果:
a c E f g h b d


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章