用c++实现邻接表和邻接矩阵两种结构,分别实现图的深度优先遍历和广度优先遍历,并显示出遍历的过程
时间: 2024-06-13 11:06:14 浏览: 123
好的,我会为你介绍如何使用C++实现图的邻接表和邻接矩阵结构,以及如何使用深度优先遍历和广度优先遍历这两种图遍历算法。
首先,我们需要定义图的数据结构。在这个例子中,我们将使用邻接表和邻接矩阵两种方式来表示图。
**邻接表**
```cpp
#include <iostream>
#include <vector>
using namespace std;
class Graph {
int V; // 顶点的数量
vector<vector<int>> adjList; // 邻接表
public:
Graph(int V); // 构造函数
void addEdge(int v, int w); // 添加边的方法
void DFS(int v); // 深度优先遍历
};
Graph::Graph(int V) {
this->V = V;
adjList = vector<vector<int>>(V); // 初始化邻接表
}
void Graph::addEdge(int v, int w) {
adjList[v].push_back(w); // 在邻接表中添加边
}
void Graph::DFS(int v) {
vector<bool> visited(V, false); // 记录是否访问过某个顶点
int dfsCounter = 0; // 计数器,用来追踪有多少顶点已经被访问过
visited[v] = true; // 将起始顶点标记为已访问
cout << v << " "; // 在打印时标记访问的顺序(可忽略)
for (int i = 0; i < adjList[v].size(); i++) {
int child = adjList[v][i]; // 获取当前顶点的所有邻居顶点
if (!visited[child]) { // 如果邻居顶点未被访问过,则进行深度优先遍历
cout << child << " "; // 打印邻居顶点,并标记为已访问
visited[child] = true; // 将邻居顶点标记为已访问
dfsCounter++; // 计数器加一,表示又有一个顶点被访问过
if (dfsCounter == V - 1) { // 如果所有的顶点都已经被访问过,则打印出所有的顶点
cout << "结束" << endl;
break;
}
}
}
}
```
**邻接矩阵**
邻接矩阵是一种用二维数组表示图的数据结构。数组中的每个元素表示两个顶点之间的边的存在与否。如果顶点i和顶点j之间有边,则矩阵的第i行第j列元素为1,否则为0。
以下是一个简单的实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class Graph {
int V; // 顶点的数量
vector<vector<int>> matrix; // 邻接矩阵表示的图
public:
Graph(int V); // 构造函数,初始化矩阵和顶点数量
void addEdge(int v, int w); // 添加边的方法,修改矩阵元素值表示边的存在与否
void BFS(int s); // 广度优先遍历方法(BFS)
};
Graph::Graph(int V) { // 初始化矩阵和顶点数量为V*V的大小,并全部初始化为0(无边)
this->V = V;
matrix = vector<vector<int>>(V, vector<int>(V, 0)); // 初始化邻接矩阵为0(无边)
}
void Graph::addEdge(int v, int w) { // 在邻接矩阵中添加边,如果存在则修改值为1,否则为0(无边)
if (matrix[v][w] == 0) { // 如果v和w之间没有边,则添加一条边,并修改值为1(存在)
matrix[v][w] = 1; // 将v和w之间的边的存在与否设置为1(存在)或0(无边)的逻辑代码在添加的过程中完成。注意这个过程是一个操作序列。如果你想要使用另一种方法来表示图的邻接矩阵,你需要选择一种合适的逻辑来实现这个过程。在这个例子中,我们简单地用数组来表示图的数据结构,不提供额外的方法来实现边或顶点的插入/删除。注意这种方法假设了一个全局的状态转移或者条件表达式用于比较数组的当前值与边缘的状态是否相等(添加或者不存在)。然而这取决于具体的图结构和使用环境,你可能需要使用不同的方法来实现
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)