1.建立任意无向图,采用邻接矩阵存储,完成以下操作: (1)对该图进行深度优先遍历,并输出遍历结果; (2)对该图进行广度优先遍历,并输出遍历结果。
时间: 2024-02-18 10:03:00 浏览: 60
好的,这是一个比较基础的图算法实现,下面是一个 C++ 的示例代码,用邻接矩阵存储图,并实现了深度优先遍历和广度优先遍历算法:
```cpp
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
const int MAX_SIZE = 100; // 图的最大顶点数
class Graph {
private:
int vertexCount; // 顶点数量
int edge[MAX_SIZE][MAX_SIZE]; // 邻接矩阵
public:
Graph(int count) : vertexCount(count) {
// 初始化邻接矩阵
for (int i = 0; i < count; i++) {
for (int j = 0; j < count; j++) {
edge[i][j] = 0;
}
}
}
// 添加一条边
void addEdge(int from, int to) {
edge[from][to] = 1;
edge[to][from] = 1;
}
// 深度优先遍历
void dfs(int start) {
bool visited[MAX_SIZE] = {false}; // 标记是否已经访问
stack<int> st;
st.push(start);
visited[start] = true;
cout << start << " ";
while (!st.empty()) {
int cur = st.top();
bool found = false;
for (int i = 0; i < vertexCount; i++) {
if (edge[cur][i] == 1 && !visited[i]) {
st.push(i);
visited[i] = true;
cout << i << " ";
found = true;
break;
}
}
if (!found) {
st.pop();
}
}
}
// 广度优先遍历
void bfs(int start) {
bool visited[MAX_SIZE] = {false}; // 标记是否已经访问
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
cout << cur << " ";
for (int i = 0; i < vertexCount; i++) {
if (edge[cur][i] == 1 && !visited[i]) {
q.push(i);
visited[i] = true;
}
}
}
}
};
int main() {
Graph g(6); // 建立一个有 6 个顶点的图
// 添加边
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(2, 4);
g.addEdge(3, 4);
g.addEdge(3, 5);
g.addEdge(4, 5);
// 执行深度优先遍历和广度优先遍历
cout << "DFS: ";
g.dfs(0);
cout << endl;
cout << "BFS: ";
g.bfs(0);
cout << endl;
return 0;
}
```
以上代码中,我们先定义了一个 `Graph` 类,它包含了顶点数量和邻接矩阵两个私有成员变量,以及添加边、深度优先遍历和广度优先遍历三个公有方法。在 `main()` 函数中,我们建立了一个有 6 个顶点的图,并添加了若干条边。然后我们分别调用 `dfs()` 和 `bfs()` 方法进行深度优先遍历和广度优先遍历,并输出遍历结果。
希望这个示例代码可以帮助您理解实现的思路。
阅读全文