图的DFS和BFS的C++实现
程序员文章站
2022-05-24 08:47:39
...
使用邻接矩阵存储图
#include <iostream>
#include <queue>
using namespace std;
int vertex[100]; // 顶点数组
int edge[100][100]; // 边数组
bool visited[100]; // 访问标记
int n; // 顶点个数
void visit(int v) {
cout << vertex[v] << " ";
}
void DFS(int v) {
visit(v); // 访问顶点元素
visited[v] = true;
for (int w = 0; w < n; w++) {
if (edge[v][w] == 1 && visited[w] == false) {
visited[w] = true;
DFS(w);
}
}
}
void BFS(int v) {
visit(v);
visited[v] = true;
queue<int> Q;
Q.push(v);
while (!Q.empty()) {
int f = Q.front();
Q.pop();
for (int w = 0; w < n; w++) {
if (edge[w][f] == 1 && visited[w] == false) {
visit(w);
visited[w] = true;
Q.push(w);
}
}
}
}
int main() {
n = 8; // 顶点个数
/*--------------初始化-----------------*/
for (int i = 0; i < n; i++) {
vertex[i] = i;
}
for(int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j)
edge[i][j] = 0;
else edge[i][j] = 0x3fffffff;
}
}
edge[0][1] = 1; edge[1][0] = 1;
edge[0][3] = 1; edge[3][0] = 1;
edge[4][3] = 1; edge[3][4] = 1;
edge[1][4] = 1; edge[4][1] = 1;
edge[1][6] = 1; edge[6][1] = 1;
edge[1][2] = 1; edge[2][1] = 1;
edge[2][6] = 1; edge[6][2] = 1;
edge[2][5] = 1; edge[5][2] = 1;
edge[5][6] = 1; edge[6][5] = 1;
for (int i = 0; i < n; i++) {
visited[i] = false;
}
/*--------------初始化-----------------*/
cout << "==============下面是DFS==================" << endl;
for (int i = 0; i < n; i++) {
if (!visited[i])
DFS(i);
}
cout << endl;
cout << "==============下面是BFS==================" << endl;
for (int i = 0; i < n; i++) {
visited[i] = false;
}
for (int i = 0; i < n; i++) {
if (!visited[i])
BFS(i);
}
cout << endl;
return 0;
}
上一篇: 图的遍历DFS和BFS实现
推荐阅读
-
C#利用原图和水印图的重叠简单实现水印的方法
-
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
-
C++实现LeetCode(34.在有序数组中查找元素的第一个和最后一个位置)
-
DFS和BFS的比较
-
vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)
-
使用JS和canvas实现gif动图的停止和播放代码
-
C++如何实现python中的startswith和endswith
-
C++实现用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型
-
个人学习笔记:c++数组实现的模板队列和栈
-
可能是目前为止最为详细的深度优先搜索DFS和广度优先搜索BFS算法分析