用C++完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。图可以自己输入,提供完整代码
时间: 2024-03-09 18:51:13 浏览: 73
好的,下面是使用邻接表实现图的深度优先遍历和广度优先遍历的C++代码:
```c++
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
// 定义图的邻接表结构
struct edge {
int dest;
edge* next;
};
struct vertex {
edge* head;
};
// 图类
class Graph {
private:
int V; // 顶点数
vertex* adj; // 邻接表
public:
Graph(int V) {
this->V = V;
adj = new vertex[V];
for (int i = 0; i < V; ++i) {
adj[i].head = nullptr;
}
}
// 添加边
void addEdge(int src, int dest) {
edge* e = new edge;
e->dest = dest;
e->next = adj[src].head;
adj[src].head = e;
}
// 深度优先遍历
void DFS(int v, bool* visited) {
visited[v] = true;
cout << v << " ";
edge* e = adj[v].head;
while (e != nullptr) {
if (!visited[e->dest]) {
DFS(e->dest, visited);
}
e = e->next;
}
}
// 广度优先遍历
void BFS(int v, bool* visited) {
queue<int> q;
visited[v] = true;
q.push(v);
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
edge* e = adj[u].head;
while (e != nullptr) {
if (!visited[e->dest]) {
visited[e->dest] = true;
q.push(e->dest);
}
e = e->next;
}
}
}
};
int main() {
int V, E;
cout << "请输入顶点数和边数:" << endl;
cin >> V >> E;
Graph g(V);
cout << "请输入每条边的起点和终点:" << endl;
for (int i = 0; i < E; ++i) {
int src, dest;
cin >> src >> dest;
g.addEdge(src, dest);
}
// 深度优先遍历
cout << "深度优先遍历结果为:" << endl;
bool* visited = new bool[V];
for (int i = 0; i < V; ++i) {
visited[i] = false;
}
for (int i = 0; i < V; ++i) {
if (!visited[i]) {
g.DFS(i, visited);
}
}
cout << endl;
// 广度优先遍历
cout << "广度优先遍历结果为:" << endl;
for (int i = 0; i < V; ++i) {
visited[i] = false;
}
for (int i = 0; i < V; ++i) {
if (!visited[i]) {
g.BFS(i, visited);
}
}
cout << endl;
return 0;
}
```
在上面的代码中,我们使用了邻接表来表示图,其中每个链表表示与该顶点相邻的顶点集合。在深度优先遍历和广度优先遍历中,我们都需要使用一个布尔数组 `visited` 来记录每个顶点是否已经被访问过。在深度优先遍历中,我们首先访问一个顶点,然后递归遍历它的相邻顶点;在广度优先遍历中,我们首先访问一个顶点,然后将其相邻顶点加入队列中,逐个访问队列中的顶点。
阅读全文