使用c++语言 对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用堆栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现图的深度优先搜索遍历。画出搜索顺序示意图。
时间: 2024-02-29 09:52:26 浏览: 178
基于C++进行图的深度优先遍历(高级语言程序设计实验)
好的,我理解了您的问题。我会根据您的要求进行回答。
首先,对于给定的图,我们可以使用邻接表来表示它。邻接表是一种常用的图的存储方式,它用链表来存储每个顶点的邻接点。具体来说,我们可以定义一个结构体来表示每个顶点及其邻接点,代码如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 邻接表中的每个节点
struct Node {
int val; // 节点的值
vector<Node*> adj; // 与该节点相邻的节点
Node(int val) : val(val) {}
};
// 建立邻接表
void buildGraph(vector<Node*>& graph, int n, int m, vector<pair<int, int>>& edges) {
graph.resize(n);
for (int i = 0; i < n; i++) {
graph[i] = new Node(i);
}
for (int i = 0; i < m; i++) {
int u = edges[i].first, v = edges[i].second;
graph[u]->adj.push_back(graph[v]);
graph[v]->adj.push_back(graph[u]);
}
}
// 输出邻接表
void printGraph(vector<Node*>& graph) {
for (int i = 0; i < graph.size(); i++) {
cout << i << ": ";
for (int j = 0; j < graph[i]->adj.size(); j++) {
cout << graph[i]->adj[j]->val << " ";
}
cout << endl;
}
}
```
其中,`buildGraph`函数用于建立邻接表,参数`n`表示顶点数,`m`表示边数,`edges`表示边的集合。`printGraph`函数用于输出邻接表。
接下来,我们可以使用堆栈来实现图的深度优先搜索遍历。深度优先搜索遍历的基本思想是从起始节点开始,沿着一条路径一直走到底,再回溯到上一个节点,继续走其他路径,直到走遍所有的节点。具体来说,我们可以使用堆栈来维护遍历的顺序。
下面是使用堆栈实现的深度优先搜索遍历的代码:
```c++
#include <stack>
// 深度优先搜索遍历
void dfs(vector<Node*>& graph, int start) {
stack<Node*> s;
vector<bool> visited(graph.size(), false);
s.push(graph[start]);
visited[start] = true;
while (!s.empty()) {
Node* node = s.top();
s.pop();
cout << node->val << " ";
for (int i = 0; i < node->adj.size(); i++) {
Node* adjNode = node->adj[i];
if (!visited[adjNode->val]) {
visited[adjNode->val] = true;
s.push(adjNode);
}
}
}
}
```
其中,`dfs`函数用于实现深度优先搜索遍历,参数`graph`表示图的邻接表,`start`表示起始节点的下标。我们使用一个堆栈`s`来维护遍历的顺序,使用一个布尔数组`visited`来记录每个节点是否被访问过。首先,我们将起始节点入栈,并将其标记为已访问。然后,我们不断从堆栈中弹出节点,并输出它的值。对于每个相邻的未访问的节点,我们将其入栈,并标记为已访问。
最后,我们可以使用上述代码进行测试,并画出搜索顺序示意图来表示搜索的顺序。示例代码如下:
```c++
int main() {
int n = 5, m = 5;
vector<pair<int, int>> edges = {{0, 1}, {0, 2}, {1, 2}, {2, 3}, {3, 4}};
vector<Node*> graph;
buildGraph(graph, n, m, edges);
printGraph(graph);
dfs(graph, 0);
return 0;
}
```
输出结果为:
```
0: 1 2
1: 0 2
2: 0 1 3
3: 2 4
4: 3
0 2 3 4 1
```
搜索顺序示意图如下:
```
0 -> 1 -> 2 -> 3 -> 4
-> 2 -> 3 -> 4
-> 3 -> 4
-> 4
```
阅读全文