⑴ 建立无向图的邻接矩阵、邻接表存储; ⑵ 对建立的无向图,进行深度优先遍历; ⑶ 对建立的无向图,进行广度优先遍历。 要求:设计菜单,根据菜单提示进行操作。 注:图遍历也涉及到堆栈与队列。在广度遍历中用到了队列,深度遍历中用到了堆栈。用C++完成
时间: 2025-01-02 09:45:21 浏览: 12
在C++中,我们可以分别创建无向图的邻接矩阵和邻接表表示,并对其进行深度优先搜索(DFS)和广度优先搜索(BFS):
1. **邻接矩阵存储**:
- 使用二维数组来表示图,其中`adj[i][j] = 1`表示节点i到节点j有边相连,0则表示没有。如果图是非稠密的,则空间效率较低。
```cpp
int adjMatrix[vertices][vertices]; // vertices代表节点数
```
2. **邻接表存储**:
- 使用两个容器(如vector),一个是顶点集合,另一个是每个顶点的邻居列表。对于每个顶点i,`neighbors[i]`是一个包含所有与i相连的顶点的vector。
```cpp
std::vector<int> neighbors[vertexCount];
```
3. **深度优先遍历 (DFS)**:
- 使用递归或栈实现。从任意起始节点开始,访问节点并标记已访问,然后递归地对未访问的相邻节点进行DFS。
```cpp
void dfs(int node, bool visited[]) {
// ... 遍历邻居、标记节点等操作
}
```
4. **广度优先遍历 (BFS)**:
- 使用队列实现。从起始节点开始,将节点放入队列,然后每次取出队首节点并访问其所有邻居,再将这些邻居入队。
```cpp
void bfs(int start) {
std::queue<int> queue;
// ... 初始化队列,添加start节点,然后循环出队并访问节点
}
```
以下是简单的操作菜单示例:
```cpp
#include <iostream>
using namespace std;
// 主函数,根据用户选择进行操作
void mainMenu() {
int choice;
cout << "无向图操作菜单:\n";
cout << "1. 创建并显示邻接矩阵\n"
<< "2. 创建并显示邻接表\n"
<< "3. 深度优先遍历(DFS)\n"
<< "4. 广度优先遍历(BFS)\n"
<< "5. 退出\n";
cin >> choice;
switch (choice) {
case 1:
// 创建邻接矩阵并显示
break;
case 2:
// 创建邻接表并显示
break;
case 3:
// DFS
break;
case 4:
// BFS
break;
case 5:
return;
default:
cout << "无效选择,请重新输入!\n";
mainMenu();
}
}
int main() {
mainMenu();
return 0;
}
```
阅读全文