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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++实现图的深度优先遍历和广度优先遍历

發(fā)布時(shí)間:2024/4/11 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++实现图的深度优先遍历和广度优先遍历 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圖的深度和廣度優(yōu)先遍歷

  • 圖的深度優(yōu)先遍歷
    • 1、算法思想
    • 2、鄰接矩陣構(gòu)造圖
    • 3、鄰接表構(gòu)造圖
  • 圖的廣度優(yōu)先遍歷
    • 1、算法思想
    • 2、鄰接矩陣構(gòu)造圖

圖的深度優(yōu)先遍歷

1、算法思想

  • (1)從圖中的某個(gè)初始點(diǎn) v 出發(fā),首先訪問初始點(diǎn) v.
  • (2)選擇一個(gè)與頂點(diǎn) v 相鄰且沒被訪問過的頂點(diǎn) ver ,以 ver為初始頂點(diǎn),再從它出發(fā)進(jìn)行深度優(yōu)先遍歷。
  • (3)當(dāng)路徑上被遍歷完,就訪問上一個(gè)頂點(diǎn)的第 二個(gè)相鄰頂點(diǎn)。
  • (4)直到所有與初始頂點(diǎn) v聯(lián)通的頂點(diǎn)都被訪問。

2、鄰接矩陣構(gòu)造圖

#include <iostream> #include <vector>using namespace std;#define VERTEXNUM 5void createGraph(vector<vector<int>>&edge, int start, int end); void displayGraph(vector<vector<int>>&edge); void DFS(vector<vector<int>>&edge , vector<int>& vertexStatusArr); void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr);int main(void) {//初始化鄰接矩陣vector<vector<int>>edge(VERTEXNUM, vector<int>(VERTEXNUM, 0));//存放頂點(diǎn)的遍歷狀態(tài),0:未遍歷,1:已遍歷 vector<int> vertexStatusArr (VERTEXNUM,0);cout << "after init: " << endl;displayGraph(edge);//創(chuàng)建圖createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);cout << "after create: " << endl;displayGraph(edge);//深度優(yōu)先遍歷DFS(edge, vertexStatusArr);return 0; } //創(chuàng)建圖 void createGraph(vector<vector<int>>&edge, int start, int end) {edge[start][end] = 1; } //打印存儲(chǔ)的圖 void displayGraph(vector<vector<int>>&edge) {int i, j;for (i = 0; i<VERTEXNUM; i++) {for (j = 0; j<VERTEXNUM; j++) {//printf("%d ", edge[i][j]);cout << edge[i][j] << " ";}cout << endl;} } //深度優(yōu)先遍歷 void DFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr) {cout << "start BFT graph: " << endl;for (int i = 0; i<VERTEXNUM; i++) {DFScore(edge, i, vertexStatusArr);}cout << endl; } void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr) {if (vertexStatusArr[i] == 1) {return;}cout << i << " ";vertexStatusArr[i] = 1;for (int j = 0; j<VERTEXNUM; j++) {if (edge[i][j] == 1) {DFScore(edge, j, vertexStatusArr);}} }

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

設(shè)有n個(gè)點(diǎn),e條邊
鄰接矩陣:矩陣包含n ^2個(gè)元素,在算法中,共n個(gè)頂點(diǎn),對每個(gè)頂點(diǎn)都要遍歷n次,所以時(shí)間復(fù)雜度為O(n^2)

3、鄰接表構(gòu)造圖?

#include <stdio.h> #include <malloc.h>#define VERTEXNUM 5//存放頂點(diǎn)的鄰接表元素 typedef struct edge {int vertex;struct edge* next; }st_edge;void createGraph(st_edge** edge, int start, int end); void displayGraph(st_edge** edge); void delGraph(st_edge** edge); void DFT(st_edge** edge, int* vertexStatusArr); void DFTcore(st_edge** edge, int i, int* vertexStatusArr);int main(void) {//動(dòng)態(tài)創(chuàng)建存放邊的指針數(shù)組 st_edge** edge = (st_edge**)malloc(sizeof(st_edge*)*VERTEXNUM);int i;for (i = 0; i<VERTEXNUM; i++) {edge[i] = NULL;}//存放頂點(diǎn)的遍歷狀態(tài),0:未遍歷,1:已遍歷 int* vertexStatusArr = (int*)malloc(sizeof(int)*VERTEXNUM);for (i = 0; i<VERTEXNUM; i++) {vertexStatusArr[i] = 0;}printf("after init:\n");displayGraph(edge);//創(chuàng)建圖 createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);printf("after create:\n");displayGraph(edge);//深度優(yōu)先遍歷 DFT(edge, vertexStatusArr);//釋放鄰接表占用的內(nèi)存 delGraph(edge);edge = NULL;free(vertexStatusArr);vertexStatusArr = NULL;return 0; } //創(chuàng)建圖 void createGraph(st_edge** edge, int start, int end) {st_edge* newedge = (st_edge*)malloc(sizeof(st_edge));newedge->vertex = end;newedge->next = NULL;edge = edge + start;while (*edge != NULL) {edge = &((*edge)->next);}*edge = newedge; } //打印存儲(chǔ)的圖 void displayGraph(st_edge** edge) {int i;st_edge* p;for (i = 0; i<VERTEXNUM; i++) {printf("%d:", i);p = *(edge + i);while (p != NULL) {printf("%d ", p->vertex);p = p->next;}printf("\n");} } //釋放鄰接表占用的內(nèi)存 void delGraph(st_edge** edge) {int i;st_edge* p;st_edge* del;for (i = 0; i<VERTEXNUM; i++) {p = *(edge + i);while (p != NULL) {del = p;p = p->next;free(del);}edge[i] = NULL;}free(edge); } //深度優(yōu)先遍歷 void DFT(st_edge** edge, int* vertexStatusArr) {printf("start BFT graph:\n");int i;for (i = 0; i<VERTEXNUM; i++) {DFTcore(edge, i, vertexStatusArr);}printf("\n"); }void DFTcore(st_edge** edge, int i, int* vertexStatusArr) {if (vertexStatusArr[i] == 1) {return;}printf("%d ", i);vertexStatusArr[i] = 1;st_edge* p = *(edge + i);while (p != NULL) {DFTcore(edge, p->vertex, vertexStatusArr);p = p->next;} }

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

鄰接表:包含n個(gè)頭結(jié)點(diǎn)和e個(gè)表結(jié)點(diǎn),算法中對所有結(jié)點(diǎn)都要遍歷一次,所以時(shí)間復(fù)雜度為O(n+e)

?圖的廣度優(yōu)先遍歷

1、算法思想

廣度優(yōu)先遍歷( Breadth_First_Search) ,又稱為廣度優(yōu)先搜索,簡稱BFS。

它的思想是:

從圖中某頂點(diǎn)v出發(fā),在訪問了v之后依次訪問v的各個(gè)未曾訪問過的鄰接點(diǎn),
然后分別從這些鄰接點(diǎn)出發(fā)依次訪問它們的鄰接點(diǎn),并使得“先被訪問的頂點(diǎn)的鄰接點(diǎn)先于后被訪問的頂點(diǎn)的鄰接點(diǎn)被訪問,直至圖中所有已被訪問的頂點(diǎn)的鄰接點(diǎn)都被訪問到。
如果此時(shí)圖中尚有頂點(diǎn)未被訪問,則需要另選一個(gè)未曾被訪問過的頂點(diǎn)作為新的起始點(diǎn),重復(fù)上述過程,直至圖中所有頂點(diǎn)都被訪問到為止。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

2、鄰接矩陣構(gòu)造圖

#include <iostream> #include <vector> #include <queue>using namespace std;#define VERTEXNUM 5void createGraph(vector<vector<int>>&edge, int start, int end); void displayGraph(vector<vector<int>>&edge); void DFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr); void DFScore(vector<vector<int>>&edge, int i, vector<int>& vertexStatusArr); void BFS(vector<vector<int>>&edge, vector<int>& vertexStatusArr);int main(void) {//初始化鄰接矩陣vector<vector<int>>edge(VERTEXNUM, vector<int>(VERTEXNUM, 0));//存放頂點(diǎn)的遍歷狀態(tài),0:未遍歷,1:已遍歷 vector<int> vertexStatusArr(VERTEXNUM, 0);cout << "after init: " << endl;displayGraph(edge);//創(chuàng)建圖createGraph(edge, 0, 3);createGraph(edge, 0, 4);createGraph(edge, 3, 1);createGraph(edge, 3, 2);createGraph(edge, 4, 1);cout << "after create: " << endl;displayGraph(edge);//深度優(yōu)先遍歷//DFS(edge, vertexStatusArr);BFS(edge, vertexStatusArr);return 0; } //創(chuàng)建圖 void createGraph(vector<vector<int>>&edge, int start, int end) {edge[start][end] = 1; } //打印存儲(chǔ)的圖 void displayGraph(vector<vector<int>>&edge) {int i, j;for (i = 0; i<VERTEXNUM; i++) {for (j = 0; j<VERTEXNUM; j++) {//printf("%d ", edge[i][j]);cout << edge[i][j] << " ";}cout << endl;} }//BFS void BFS(vector<vector<int>>&edge ,vector<int>& vertexStatusArr) {queue<int>q;q.push(0);vertexStatusArr[0] = 1;int idx = 0;while (!q.empty()){idx = q.front();q.pop();cout << idx << " ";for (int j = 0; j< VERTEXNUM; j++) {if (edge[idx][j] == 1 && vertexStatusArr[j] == 0){q.push(j);vertexStatusArr[j] = 1;}}}cout << endl; }

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

?

總結(jié)

以上是生活随笔為你收集整理的C++实现图的深度优先遍历和广度优先遍历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。