基于C++实现图的深度优先遍历算法,广度优先遍历算法,其中邻接表的创建相当于创建多个单链表并附带实例
时间: 2024-03-24 15:38:44 浏览: 68
好的,我可以为你提供基于C++的图的深度优先遍历算法和广度优先遍历算法的实现,以及邻接表的创建方法和示例代码。
邻接表的创建相当于创建多个单链表,每个单链表表示一个顶点的邻接点集合。具体实现可以使用 vector 容器存储每个顶点的邻接点,例如:
```cpp
const int MAXN = 100;
vector<int> adj[MAXN]; // 邻接表
```
这里我们定义了一个常量 MAXN 表示顶点的最大数量,邻接表 adj 是一个 vector 数组,其中 adj[u] 表示顶点 u 的邻接点集合,即一个 vector<int> 类型的容器。
接下来是图的深度优先遍历算法的实现,基于递归实现,具体步骤如下:
1. 首先访问起始点,并将其标记为已访问。
2. 遍历起始点的邻接点,对于未访问的邻接点,递归调用 DFS 函数。
3. 重复步骤 2,直到所有可达点都被访问过。
C++代码实现如下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100;
vector<int> adj[MAXN]; // 邻接表
bool vis[MAXN]; // 标记数组,标记每个顶点是否被访问过
// DFS 函数
void dfs(int u) {
vis[u] = true; // 标记为已访问
cout << u << " "; // 输出当前访问的顶点
for (int v : adj[u]) {
if (!vis[v]) { // 如果邻接点未被访问,则递归调用 DFS 函数
dfs(v);
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v; // 输入一条边的两个端点
adj[u].push_back(v); // 添加邻接点
adj[v].push_back(u);
}
dfs(1); // 从起始点 1 开始进行 DFS 遍历
return 0;
}
```
接下来是图的广度优先遍历算法的实现,基于队列实现,具体步骤如下:
1. 首先访问起始点,并将其加入队列。
2. 从队列中取出一个顶点,遍历它的邻接点,并将未访问过的邻接点加入队列。对于已经访问过的顶点,不再加入队列。
3. 重复步骤 2,直到队列为空。
C++代码实现如下:
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 100;
vector<int> adj[MAXN]; // 邻接表
bool vis[MAXN]; // 标记数组,标记每个顶点是否被访问过
// BFS 函数
void bfs(int s) {
queue<int> q; // 队列
q.push(s); // 将起始点加入队列
vis[s] = true; // 标记为已访问
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " "; // 输出当前访问的顶点
for (int v : adj[u]) {
if (!vis[v]) { // 如果邻接点未被访问,则加入队列并标记为已访问
vis[v] = true;
q.push(v);
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v; // 输入一条边的两个端点
adj[u].push_back(v); // 添加邻接点
adj[v].push_back(u);
}
bfs(1); // 从起始点 1 开始进行 BFS 遍历
return 0;
}
```
邻接表的创建示例代码如下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100;
vector<int> adj[MAXN]; // 邻接表
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v; // 输入一条边的两个端点
adj[u].push_back(v); // 添加邻接点
adj[v].push_back(u);
}
// 输出邻接表
for (int i = 1; i <= n; ++i) {
cout << "Vertex " << i << ": ";
for (int v : adj[i]) {
cout << v << " ";
}
cout << endl;
}
return 0;
}
```
希望这些代码能够帮到你,如果有其他问题,欢迎继续提问。
阅读全文