日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)

發布時間:2025/6/17 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,故省略掉。

完整示例


對上圖進行深度優先搜索和廣度優先搜索,代碼如下:

#include<iostream> #define maxSize 8//頂點數目 #define MAX 7//邊的個數 //鄰接矩陣 typedef struct {int vexnum, arcnum;//頂點數和邊數char vex[maxSize];//頂點信息(字符)int arc[maxSize][maxSize];//二維數組(存儲邊上的信息) }mGraph;//鄰接表 typedef struct arcNode {int adjvex;//與該邊所連頂點的序號double weight;//邊上的權值struct arcNode* nextArc; }arcNode;//邊表結點 typedef struct {char data;//頂點中存儲的數據arcNode* firstArc; }adjList;//頂點 typedef struct{int vexnum, arcnum;adjList vertices[maxSize]; }aGraph;bool visited[maxSize];//標記是否被訪問 void DFSTraverse(mGraph& G);//DFS搜索算法 void DFS(mGraph& G, int v); void BFSTraverse(mGraph& G);//BFS搜索算法 int main() {using namespace std;mGraph G;//鄰接矩陣存儲圖并進行初始化G.vexnum = maxSize;G.arcnum = MAX;char vexData[maxSize] = { 'a', 'b', 'c', 'd', 'e','f','g','h' };//頂點信息int arcData[MAX][2] = { { 0, 3 }, { 1, 3 }, { 2, 4 }, { 3, 4},{ 3, 5 }, { 4, 6 }, { 4, 7 } };//連接的邊int i, j;for (i = 0; i < G.vexnum; ++i){G.vex[i] = vexData[i];for (j = 0; j < G.vexnum; j++)G.arc[i][j] = 0;}for (i = 0; i < G.arcnum; i++)G.arc[arcData[i][0]][arcData[i][1]] = G.arc[arcData[i][1]][arcData[i][0]] = 1;//初始化完畢cout << "深度優先搜索: ";DFSTraverse(G);cout << endl;cout << "廣度優先搜索: ";BFSTraverse(G);cout << endl;return 0; }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); } 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;}}}} }

輸出結果為:

總結

以上是生活随笔為你收集整理的DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。