头歌数据结构--图的遍历
·
任务描述
本关任务:编写一个程序实现图的遍历。
相关知识
为了完成本关任务,你需要掌握:
1.深度优先遍历,采用递归算法;
2.广度优先遍历。
带权有向图
带权有向图如下图所示,要求指定初始点,从初始点出发进行图的遍历。
输出遍历顶点的格式如下所示:
printf("%3d",v);

测试说明
平台会对你编写的代码进行测试:
测试输入:0
预期输出:
从顶点0开始的DFS:
0 1 2 5 4 3
从顶点0开始的BFS:
0 1 3 2 5 4
代码如下:
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm> // 用于sort
using namespace std;
class Graph {
private:
int V; // 顶点数
vector<vector<int>> adj; // 邻接表
public:
// 构造函数
Graph(int V) {
this->V = V;
adj.resize(V);
}
// 添加有向边
void addEdge(int u, int v) {
adj[u].push_back(v);
}
// 深度优先遍历
void DFS(int start) {
vector<bool> visited(V, false); // 访问标记
stack<int> s; // 使用栈实现DFS
s.push(start);
cout << "从顶点" << start << "开始的DFS:\n";
while (!s.empty()) {
int v = s.top();
s.pop();
if (!visited[v]) {
visited[v] = true;
printf("%3d", v); // 输出顶点
}
// 遍历邻接节点,逆序入栈
for (int i = adj[v].size() - 1; i >= 0; --i) {
int neighbor = adj[v][i];
if (!visited[neighbor]) {
s.push(neighbor);
}
}
}
cout << endl;
}
// 广度优先遍历
void BFS(int start) {
vector<bool> visited(V, false); // 访问标记
queue<int> q; // 使用队列实现BFS
q.push(start);
visited[start] = true;
cout << "从顶点" << start << "开始的BFS:\n";
while (!q.empty()) {
int v = q.front();
q.pop();
printf("%3d", v); // 输出顶点
// 遍历邻接节点
for (int neighbor : adj[v]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
cout << endl;
}
// 函数:排序邻接表
void sortAdjacencyList() {
for (int i = 0; i < V; ++i) {
sort(adj[i].begin(), adj[i].end()); // 对每个邻接链表进行排序
}
}
};
int main() {
int V = 6; // 顶点数量
Graph g(V);
// 添加边 (u, v)
g.addEdge(5, 4);
g.addEdge(4, 3);
g.addEdge(3, 2);
g.addEdge(2, 0);
g.addEdge(0, 1);
g.addEdge(0, 3);
g.addEdge(1, 2);
g.addEdge(3, 5);
g.addEdge(2, 5);
g.addEdge(5, 0);
// 手动控制邻接表的顺序
g.sortAdjacencyList();
int startVertex;
cin >> startVertex;
// 进行深度优先遍历和广度优先遍历
g.DFS(startVertex);
g.BFS(startVertex);
return 0;
}
更多推荐
所有评论(0)