C++实现图的深度优先遍历和广度优先遍历
圖的深度和廣度優(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go基础编程:命名、变量、常量
- 下一篇: LRU原理及其实现(C++)