圖的遍歷(DFS和BFS)
阿新 • • 發佈:2021-08-19
深度優先遍歷(DFS)
思想:
一條路走到底,走到被訪問過的結點,退回一個節點,遍歷未訪問的結點,重複此項工作。(遍歷次序可能不同)
案例:根的先根遍歷
程式碼(鄰接矩陣)(連通圖)
void DFS(AMGraph G,int v)//v起始頂點 { int Visited[AMGraph.vexnum];//輔助陣列:記錄節點有沒有被訪問過 memset(Visited,0,sizeof(Visited));//0代表未訪問過 cout<<v ; Visited[v]=1; for(int w=0;w<G.vexnum;w++) { if(G.arcnum[v][w]!=0&&(!Visited[w])) DFS(G,w); //w是v的鄰接點,如果w未訪問,則遞迴呼叫DFS } }
對於非連通圖:遍歷完一個連通分量後,再遍歷另一個連通分量
廣度優先搜尋(BFS)
思想:
先訪問完一個節點的所有鄰接點,然後按照鄰接點的被訪問順序,重複此過程,直到所有節點都被訪問。
類似於:樹的層次遍歷
程式碼
void BFS(ALGraph G,int v)//非遞迴 { int visited[G.vexnum];//用作該節點有沒有被訪問過 memset(visited,0,sizeof(visited)); cout<<v;visited[v]=1; initQueue(Q);//初始化佇列Q EnQueue(Q,v);//v進隊 while(!QueueEmpty(Q))//佇列非空 { DeQueue(Q,u);//隊頭元素出隊並置為u for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) { if(!visited[w]) { cout<<w;visited[w]=1; EnQueue(Q,w);//w進隊 } } } }
鄰接矩陣時間複雜度:O(n²)
鄰接表時間複雜度O(m+e)
空間複雜度O(n)