資料結構——第四章圖:03圖的遍歷
1.圖的遍歷:從圖中某個頂點出發遊歷圖,訪遍圖中其餘頂點,並且使圖中的每個頂點僅被訪問一次的過程。有兩種遍歷方式:深度優先遍歷、廣度優先遍歷。
2.深度優先搜尋遍歷圖:
(1)連通圖的深度優先搜尋遍歷:從圖中某個頂點v0出發,訪問此頂點,然後依次從v0的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v0有路徑相同的頂點都被訪問到。
void DFS(Graph G, int v) //從頂點v出發,深度優先搜尋遍歷連通圖G
{
visited[v] = TRUE;
VisitFunc(v);
for (w = FirstAdjVex(G, v); w != 0; w = NextAdjVex(G, v, w))
{
if (!visited[w]) //對v的未訪問過的鄰接點w遞迴呼叫DFS
{
DFS(G, w);
}
}
}
(2)非連通圖的深度優先搜尋遍歷:首先將圖中每個頂點的訪問標誌設為FALSE,之後搜尋圖中每個頂點,如果未被訪問,則以該頂點為起始點,進行深度優先搜尋遍歷,否則繼續檢查下一個頂點。
void DFSTraverse(Graph G, int v) //對圖G做深度優先遍歷
{
for (v = 0; v < G.vexnum; ++v)
{
visited[v] = FLASE; //訪問標誌陣列初始化
}
for (v = 0; v < G.vexnum; ++v)
{
if (!visited[v]) //對未訪問過的頂點呼叫DFS
{
DFS(G, v);
}
}
}
3.廣度優先搜尋遍歷圖:從圖中的某個頂點v0出發,並在訪問此頂點之後依次訪問v0的所有未被訪問過的鄰接點,之後按這些頂點被訪問的先後次序依次訪問它們的鄰接點,直至圖中所有和v0有路徑相通的頂點都被訪問到。若此時圖中還有頂點未被訪問,則另選圖中一個未曾被訪問的頂點做起始點,重複上述過程,直至圖中所有頂點都被訪問到為止(類似於樹的層序遍歷)。
void BFSTraverse(Graph G, int v)
{
for (v = 0; v < G.vexnum; v++)
{
visited[v] = FALSE; //初始化訪問標誌
}
InitQueue(Q); //置空的輔助佇列Q
for (v = 0; v < G.vexnum; v++)
{
if (!visited[v]) //v未被訪問
{
visited[v] = TRUE;
visit(v); //訪問v
EnQueue(Q, v); //v入佇列
while (!QueueEmpty(Q))
{
DeQueue(Q, u); //隊頭元素出隊並置為u
for(w = FirstAdjVex(G, u); w != 0; w = NextAdjVex(G, u, w))
{
if (!visited[w])
{
visited[w] = TRUE;
visit(w);
EnQueue(Q, w); //訪問的頂點w入佇列
}
}
}
}
}
}