内容:采用邻接矩阵或邻接表存储结构来建立有向图或无向图,分别实现图的深度优先遍历递 归和非递归算法以及广度优先遍历算法.语言为c++
时间: 2024-12-17 08:31:14 浏览: 9
在C++中,我们可以使用邻接矩阵或邻接表来存储有向图或无向图。这里我会分别介绍如何用这两种数据结构实现深度优先搜索(DFS)和广度优先搜索(BFS)的递归和非递归版本。
**邻接矩阵**:
```cpp
#include <iostream>
using namespace std;
// 邻接矩阵
typedef vector<vector<bool>> AdjMatrix;
// 递归DFS
void dfsRec(AdjMatrix graph, int src, vector<bool>& visited) {
visited[src] = true;
cout << src << " ";
for (int i = 0; i < graph.size(); i++) {
if (graph[src][i] && !visited[i]) {
dfsRec(graph, i, visited);
}
}
}
// 非递归DFS
void dfsNonRec(AdjMatrix graph, int src, vector<bool>& visited, stack<int>& s) {
visited[src] = true;
cout << src << " ";
s.push(src);
while (!s.empty()) {
int node = s.top();
s.pop();
for (int i = 0; i < graph.size(); i++) {
if (graph[node][i] && !visited[i]) {
visited[i] = true;
cout << i << " ";
s.push(i);
}
}
}
}
// 非递归BFS
void bfsNonRec(AdjMatrix graph, int src) {
bool visited[graph.size()] = {false};
queue<int> q;
visited[src] = true;
q.push(src);
while (!q.empty()) {
int node = q.front();
cout << node << " ";
q.pop();
for (int i = 0; i < graph.size(); i++) {
if (graph[node][i] && !visited[i]) {
visited[i] = true;
q.push(i);
}
}
}
}
int main() {
// 实例化邻接矩阵...
// 调用相应遍历方法...
return 0;
}
```
**邻接表**:
```cpp
#include <iostream>
#include <list>
using namespace std;
// 边的结构体
struct Edge {
int dest;
bool weight; // 或者其他表示边属性的数据类型
};
// 邻接表
typedef list<Edge> AdjList;
// 同样的遍历函数,这里省略了具体实现,因为邻接表需要一个额外的结构来存储邻居,代码会稍微复杂一些。
// 然而基本的思路是一致的,只是查找邻居的方式不同。
int main() {
// 实例化邻接表...
// 调用相应遍历方法...
return 0;
}
```
阅读全文