根据输入的节点数和边数完成一个图,根据图的深度优先遍历算法、广度优先遍历算法输出。其中,邻接表的创建相当于创建多个单链表。用C++语言并给出注释
时间: 2024-03-10 22:46:05 浏览: 70
好的,我可以为您解答这个问题。
首先,我们需要了解一下深度优先遍历算法和广度优先遍历算法的基本思想和步骤。
深度优先遍历算法:从图的某个顶点开始遍历,沿着一条路径一直走到底,直到不能再走为止,然后回退到前一个节点,再沿着另一条路径继续走到底,直到所有的节点都被遍历过为止。
广度优先遍历算法:从图的某个顶点开始遍历,先访问所有与该顶点相邻的节点,然后再依次访问与这些节点相邻的所有节点,直到所有的节点都被遍历过为止。
邻接表是一种常见的图的表示方法,它用一个一维数组存储图中的所有顶点,每个顶点对应一个单链表,链表中存储该顶点所连的所有边的信息。
下面是基于邻接表的深度优先遍历算法和广度优先遍历算法的实现:
```c++
#include <iostream>
#include <queue>
using namespace std;
// 定义节点
struct Node {
int val;
Node* next;
Node(int x) : val(x), next(NULL) {}
};
// 定义图
class Graph {
public:
Graph(int n) : n(n), adj(new Node*[n]()) {}
~Graph() {
for (int i = 0; i < n; ++i) {
Node* cur = adj[i];
while (cur) {
Node* temp = cur;
cur = cur->next;
delete temp;
}
}
delete[] adj;
}
// 添加一条边
void add_edge(int s, int t) {
Node* node = new Node(t);
node->next = adj[s];
adj[s] = node;
}
// 深度优先遍历
void dfs(int s) {
bool* visited = new bool[n]();
_dfs(s, visited);
delete[] visited;
}
void _dfs(int node, bool* visited) {
visited[node] = true; // 标记节点已被访问
cout << node << " "; // 访问节点
Node* next_node = adj[node];
while (next_node) {
if (!visited[next_node->val]) {
_dfs(next_node->val, visited);
}
next_node = next_node->next;
}
}
// 广度优先遍历
void bfs(int s) {
bool* visited = new bool[n]();
queue<int> q;
q.push(s);
visited[s] = true; // 标记节点已被访问
while (!q.empty()) {
int node = q.front();
q.pop();
cout << node << " "; // 访问节点
Node* next_node = adj[node];
while (next_node) {
if (!visited[next_node->val]) {
q.push(next_node->val);
visited[next_node->val] = true; // 标记节点已被访问
}
next_node = next_node->next;
}
}
delete[] visited;
}
private:
int n; // 图中节点的个数
Node** adj; // 邻接表
};
int main() {
int n, m; // 节点数和边数
cin >> n >> m;
Graph g(n);
for (int i = 0; i < m; ++i) {
int s, t;
cin >> s >> t;
g.add_edge(s, t);
}
cout << "DFS: ";
g.dfs(0);
cout << endl;
cout << "BFS: ";
g.bfs(0);
cout << endl;
return 0;
}
```
以上就是基于邻接表的深度优先遍历算法和广度优先遍历算法的C++实现。希望可以帮助到您!
阅读全文