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

圖的遍歷BFS

圖的遍歷BFS

  1. 廣度優先遍歷
  2. 深度優先遍歷

可以進行標記

樹的廣度優先遍歷,我們用了輔助的佇列

bool visited[MAX_VERTEX_NUM] 	//訪問標記陣列
//廣度優先遍歷
void BFS(Graph G,int v){		//從頂點v出發,廣度優先遍歷圖G
    visit(v);					//訪問初始頂點v
    visited[v] = TRUE;			//對v做已訪問標記
    Enqueue(Q,v);				//頂點v入佇列Q
    while(!isEmpty(Q)){
        DeQueue(Q,v);			//頂點v出佇列
        for(w=FirstNeighbor(G,v);w>=0;
            w=NextNeighbor(G,v.w))
            if(!visited[w]){	//w為v的尚未訪問的鄰接頂點
                visit(w);		//訪問頂點w
                visited[w]=TRUE;//對w做已訪問標記
                EnQueue(Q,w);	//頂點w入佇列
            }
    }
}

存在問題:如果是非連通圖,則無法遍歷完所有結點

解決:判斷數組裡還有沒有false的元素

void BFSTraverse(Graph G){
    for(i=0;i<G.vexnum;++i)
        visited[i] = FALSE;
    InitQueue(Q);
    for(i=0;i<G.vexnum;++i){
        if(!visited[i])
            BFS(G,i);
    }
}

對於無向圖來說,呼叫bfs函式的次數=連通分量數

複雜度分析

廣度優先生成樹

廣度優先生成森林