1. 程式人生 > 實用技巧 >7.3 圖的遍歷

7.3 圖的遍歷


title: 資料結構 | 圖-3 | 圖的遍歷
date: 2019-11-26 22:38:52
tags: 資料結構


BFS、DFS

深度優先遍歷(DFS)

  • 從圖的某一頂點V0出發,訪問此頂點;然後依次從V0的未被訪問的鄰接點出發,深度優先遍歷圖,直至圖中所有和V0相通的頂點都被訪問到;
    若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重複上述過程,直至圖中所有頂點都被訪問為止
//--- 下列演算法使用的全域性變數 ---
Boolean visited[MAX]; // 訪問標誌陣列
Status (* VisitFunc)(int v); // 函式變數

void DFS(Graph G, int v) {
// 從第v個頂點出發遞迴地深度優先遍歷圖G。
     visited[v] = TRUE; 
     VisitFunc(v); 
// 訪問第v個頂點    
	for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w))
        if(!visited[w]) 
        	DFS(G, w); 
// 對v的尚未訪問的鄰接頂點w遞迴呼叫DFS
}
void DFSTraverse(Graph G, Status (*Visit)(int v)) {
        // 對圖G作深度優先遍歷。
       VisitFunc = Visit; 
      for (v=0; v<G.vexnum; ++v) 
             visited[v] = FALSE; // 訪問標誌陣列初始化
      for (v=0; v<G.vexnum; ++v) 
            if (!visited[v]) 
            	DFS(G, v); 
             // 對尚未訪問的頂點呼叫DFS
}

廣度優先遍歷(BFS)

  • 從圖的某一頂點V0出發,訪問此頂點後,依次訪問V0的各個未曾訪問過的鄰接點;然後分別從這些鄰接點出發,廣度優先遍歷圖,直至圖中所有已被訪問的頂點的鄰接點都被訪問到;
    若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重複上述過程,直至圖中所有頂點都被訪問為止
void BFSTraverse( Graph G, status (*visit )(int v ))  {
    for( v = 0; v < G.vexnum; ++v)
        visited[v] = FALSE; 
    InitQueue( Q );
    for( v = 0; v < G.vexnum;  ++ v)
       if( !visited[v] ){
          visited[v] = TRUE;
          visit( v ); 
          EnQueue( Q, v );
          while( !QuqueEmpty( Q))  {
              Dequeue( Q, u ); 
             for(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))
	            if( !Visited[w] ){
	                Visited[w]=TRUE;
	                Visit( w );
	                Enqueue(Q,w);
                 }// if
	    }// while
      }// if
}// BFSTraverse