1. 程式人生 > >資料結構——第四章圖:03圖的遍歷

資料結構——第四章圖: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入佇列

          }

        }

      }

    }

  }

}