1. 程式人生 > 其它 >圖的遍歷(DFS和BFS)

圖的遍歷(DFS和BFS)

深度優先遍歷(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)