圖的遍歷-廣度優先遍歷
阿新 • • 發佈:2018-12-15
廣度優先遍歷類似於樹的按層次遍歷的過程。
規則:訪問v,訪問v的各未訪問的鄰接點,之後逐個從這些鄰接點出發重複上述操作。待與v連通的頂點訪問畢再從另一頂點出發。
實現:對各個頂點v,若其尚未訪問則訪問,之後v入隊,隊頂元素出隊,逐個訪問其尚未訪問的鄰接點,每的訪問完一個便入隊。重複直到隊空。
演算法實現:
鄰接矩陣儲存:
void BFSTraverse(MGraph G,Status (*visit)(MGraph G,int v)){ /*圖的廣度優先遍歷 訪問v 訪問v的各為訪問的鄰接點 之後逐個從這些鄰接點出發重複上述操作 待與v連通的頂點訪問畢再從另以頂點出發 對各個頂點v 若其尚未訪問則訪 問v 之後v入隊 對頂元素出隊 逐個訪問其尚為訪問的鄰接點,每訪問完一個 就入隊 重複直到佇列空 每個頂點進一次隊 出隊時主要操作查詢鄰接點*/ int v; LinkQueue Q; InitQueue(Q); for(v=0;v<G.vexnum;v++) //初始化 visited[v]=FALSE; for(v=0;v<G.vexnum;v++){ if(!visited[v]){ visit(G,v); visited[v]=TRUE; EnQueue(Q,v); while(!QueueEmpty(Q)){ DeQueue(Q,v); for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) { if(!visited[w]) { visit(G,w); visited[w]=TRUE; EnQueue(Q,w); } } } } } }
鄰接表儲存:
void BFSTraverse(ALGraph G,Status (*visit)(ALGraph G,int v)){ /*圖的廣度優先遍歷 訪問v 訪問v的各未訪問的鄰接點,之後逐個從這些鄰接點出發重複上述操作 待與v連通的頂點訪問畢再從另以頂點出發 對各個頂點v 若其尚未訪問則訪 問v 之後v入隊 對頂元素出隊 逐個訪問其尚為訪問的鄰接點,每訪問完一個 就入隊 重複直到佇列空 每個頂點進一次隊 出隊時主要操作查詢鄰接點*/ int v,w; LinkQueue Q; InitQueue(Q); for(v=0;v<G.vexnum;v++)//初始化 visited[v]=FALSE; for(v=0;v<G.vexnum;v++){ if(!visited[v]){ visit(G,v); visited[v]=TRUE; EnQueue(Q,v); while(!QueueEmpty(Q)){ DeQueue(Q,v); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){ if(!visited[w]) { visit(G,w); visited[w]=TRUE; EnQueue(Q,w); } } } } } }