DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
深度優(yōu)先搜索算法(DFS)
深度優(yōu)先搜索算法思路:(有點(diǎn)貪心算法的意思)
1,從某個給定結(jié)點(diǎn)a出發(fā),訪問它
2,查找關(guān)于a的鄰接點(diǎn),查找到a的第一個鄰接點(diǎn)b之后,對b結(jié)點(diǎn)進(jìn)行DFS搜索,也就是對b結(jié)點(diǎn)執(zhí)行步驟2…當(dāng)某個結(jié)點(diǎn)的所有鄰接點(diǎn)都被訪問過之后,回退上一層DFS算法中繼續(xù)運(yùn)行
3,程序執(zhí)行完畢
下面給出了在鄰接矩陣存儲無向圖情況下的深度優(yōu)先算法,兩點(diǎn)間存在相連的邊時在鄰接矩陣中標(biāo)記為1,否則全標(biāo)記為0(包括自身到自身相連的情況)。每個被訪問過的結(jié)點(diǎn)用visited數(shù)組標(biāo)記:
void DFSTraverse(mGraph& G) {int v;for (v = 0; v < G.vexnum; v++)visited[v] = false;//初始化visited為空for (v = 0; v < G.vexnum; v++)//保證訪問所有結(jié)點(diǎn)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函數(shù):
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); }廣度優(yōu)先搜索算法(BFS)
廣度優(yōu)先搜索算法采用了輔助數(shù)據(jù)結(jié)構(gòu)隊(duì)列。
廣度優(yōu)先搜索算法思路:
1,從某個給定結(jié)點(diǎn)a開始,將其入隊(duì)
2,a出隊(duì)并進(jìn)行訪問,且將a的所有鄰接點(diǎn)依次入隊(duì),每出隊(duì)(并訪問)一個結(jié)點(diǎn),就將它的其余未被訪問過的鄰接點(diǎn)入隊(duì),直到將所有結(jié)點(diǎn)訪問,程序執(zhí)行完畢
下面給出了在鄰接矩陣存儲情況下的廣度優(yōu)先算法,每個被訪問過的結(jié)點(diǎn)用visited數(shù)組標(biāo)記:
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];//構(gòu)造循環(huán)隊(duì)列for (v = 0; v < G.vexnum; ++v)//遍歷完圖中所有結(jié)點(diǎn){if (visited[v]==false){rear = (rear + 1) % G.vexnum;queue[rear] = v;visited[v] = true;//入隊(duì)做標(biāo)記while (rear!=front)//隊(duì)列不為空時{front = (front + 1) % G.vexnum;u = queue[front];std::cout << G.vex[u] << ' ';//出隊(duì)并訪問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,故省略掉。
完整示例
對上圖進(jìn)行深度優(yōu)先搜索和廣度優(yōu)先搜索,代碼如下:
輸出結(jié)果為:
總結(jié)
以上是生活随笔為你收集整理的DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图(c/c++)
- 下一篇: 最小代价生成树Prim/Kruskal(