DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
生活随笔
收集整理的這篇文章主要介紹了
DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深度優先搜索算法(DFS)
深度優先搜索算法思路:(有點貪心算法的意思)
1,從某個給定結點a出發,訪問它
2,查找關于a的鄰接點,查找到a的第一個鄰接點b之后,對b結點進行DFS搜索,也就是對b結點執行步驟2…當某個結點的所有鄰接點都被訪問過之后,回退上一層DFS算法中繼續運行
3,程序執行完畢
下面給出了在鄰接矩陣存儲無向圖情況下的深度優先算法,兩點間存在相連的邊時在鄰接矩陣中標記為1,否則全標記為0(包括自身到自身相連的情況)。每個被訪問過的結點用visited數組標記:
void DFSTraverse(mGraph& G) {int v;for (v = 0; v < G.vexnum; v++)visited[v] = false;//初始化visited為空for (v = 0; v < G.vexnum; v++)//保證訪問所有結點if (visited[v] == false)DFS(G, v); } void DFS(mGraph& G, int v) {std::cout << G.vex[v] << ' ';visited[v] = true;int w;for (w = 0; w < G.vexnum; w++)if (G.arc[v][w]!=0)if (visited[w] == false)DFS(G, w); }鄰接表下的DFS函數:
void DFS(aGraph& G, int v) {std::cout << G.vertices[v].data << ' ';visited[v] = true;arcNode* w;for (w = G.vertices[v].firstArc; w != NULL; w = w->nextArc)if (visited[w->adjvex] == false)DFS(G, w->adjvex); }廣度優先搜索算法(BFS)
廣度優先搜索算法采用了輔助數據結構隊列。
廣度優先搜索算法思路:
1,從某個給定結點a開始,將其入隊
2,a出隊并進行訪問,且將a的所有鄰接點依次入隊,每出隊(并訪問)一個結點,就將它的其余未被訪問過的鄰接點入隊,直到將所有結點訪問,程序執行完畢
下面給出了在鄰接矩陣存儲情況下的廣度優先算法,每個被訪問過的結點用visited數組標記:
void BFSTraverse(mGraph& G) {int v, w, u;for (v = 0; v < G.vexnum; ++v)visited[v] = false;int front = 0, rear = 0;int* queue = new int[G.vexnum];//構造循環隊列for (v = 0; v < G.vexnum; ++v)//遍歷完圖中所有結點{if (visited[v]==false){rear = (rear + 1) % G.vexnum;queue[rear] = v;visited[v] = true;//入隊做標記while (rear!=front)//隊列不為空時{front = (front + 1) % G.vexnum;u = queue[front];std::cout << G.vex[u] << ' ';//出隊并訪問for (w = 0; w<G.vexnum; w++)if (G.arc[u][w] != 0)if (visited[w] == false){rear = (rear + 1) % G.vexnum;queue[rear] = w;visited[w] = true;}}}} }鄰接表下的BFS算法類似于DFS,故省略掉。
完整示例
對上圖進行深度優先搜索和廣度優先搜索,代碼如下:
輸出結果為:
總結
以上是生活随笔為你收集整理的DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图(c/c++)
- 下一篇: 最小代价生成树Prim/Kruskal(