使用C++语言创建图,并采用深度优先搜索和广度优先搜索的方法进行遍历
时间: 2023-06-13 09:08:21 浏览: 91
基于C++进行图的深度优先遍历(高级语言程序设计实验)
以下是使用C++语言创建图,并采用深度优先搜索和广度优先搜索的方法进行遍历的示例代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
// 图的邻接表表示法
class Graph
{
private:
int V; // 图的顶点数
vector<int> *adj; // 存放每个顶点的邻接表
public:
Graph(int v)
{
V = v;
adj = new vector<int>[V];
}
// 添加一条边
void addEdge(int v, int w)
{
adj[v].push_back(w);
}
// 深度优先搜索遍历图
void DFS(int s)
{
bool *visited = new bool[V];
for (int i = 0; i < V; i++)
visited[i] = false;
stack<int> stack;
stack.push(s);
while (!stack.empty())
{
s = stack.top();
stack.pop();
if (!visited[s])
{
visited[s] = true;
cout << s << " ";
for (auto i = adj[s].begin(); i != adj[s].end(); ++i)
{
if (!visited[*i])
stack.push(*i);
}
}
}
}
// 广度优先搜索遍历图
void BFS(int s)
{
bool *visited = new bool[V];
for (int i = 0; i < V; i++)
visited[i] = false;
queue<int> queue;
visited[s] = true;
queue.push(s);
while (!queue.empty())
{
s = queue.front();
cout << s << " ";
queue.pop();
for (auto i = adj[s].begin(); i != adj[s].end(); ++i)
{
if (!visited[*i])
{
visited[*i] = true;
queue.push(*i);
}
}
}
}
};
int main()
{
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
cout << "深度优先搜索遍历结果:";
g.DFS(2);
cout << endl;
cout << "广度优先搜索遍历结果:";
g.BFS(2);
cout << endl;
return 0;
}
```
在上述示例代码中,我们使用邻接表来表示图。邻接表是一个数组的数组,其中每个数组表示一个顶点的邻接表,存储从该顶点出发的所有边的目标顶点。我们使用vector容器来实现每个数组。在addEdge()函数中,我们将v和w添加到v的邻接表中。
在DFS()函数中,我们使用一个bool类型的visited数组来跟踪每个顶点是否已被访问。我们将起始顶点s推入堆栈中,并在while循环中遍历整个图。对于每个顶点,我们检查它是否被访问过,如果没有,则将其标记为已访问,并将其输出。然后,我们遍历其所有邻居,并将它们推入堆栈中,以便稍后访问。
在BFS()函数中,我们使用一个bool类型的visited数组来跟踪每个顶点是否已被访问。我们将起始顶点s推入队列中,并在while循环中遍历整个图。对于每个顶点,我们检查它是否被访问过,如果没有,则将其标记为已访问,并将其输出。然后,我们遍历其所有邻居,并将它们推入队列中,以便稍后访问。
以上就是使用C++语言创建图,并采用深度优先搜索和广度优先搜索的方法进行遍历的示例代码。
阅读全文