
本关任务:编写一个程序实现图的遍历。
为了完成本关任务,你需要掌握:
以下是一个简单的 C++ 代码示例,用于对一个图进行深度优先遍历:
#include <iostream>
#include <vector>
#include <algorithm>
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 v, vector<bool>& visited) {
visited[v] = true;
cout << v << " ";
for (int i : adj[v]) {
if (!visited[i]) {
DFS(i, visited);
}
}
}
};
int main() {
int V = 5;
Graph g(V);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
vector<bool> visited(V, false);
g.DFS(0, visited);
return 0;
}在这个示例中:
Graph 类表示图,V 是顶点数量,adj 是邻接表,用于存储每个顶点的邻接顶点。addEdge 函数用于向图中添加边,将一个顶点的邻接顶点添加到其对应的邻接表中。DFS 函数实现了深度优先遍历。它接受一个顶点索引 v 和一个用于记录访问状态的向量 visited。首先将当前顶点标记为已访问,然后输出当前顶点,接着遍历当前顶点的所有邻接顶点。对于未访问的邻接顶点,递归调用 DFS 函数进行深度优先遍历。main 函数中,创建了一个有 5 个顶点的图,添加了一些边,初始化了访问向量,然后从顶点 0 开始进行深度优先遍历。以下是一个简单的 C++ 代码示例,用于对一个图进行广度优先遍历:
#include <iostream>
#include <vector>
#include <queue>
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 BFS(int start) {
vector<bool> visited(V, false);
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int v = q.front();
q.pop();
cout << v << " ";
for (int i : adj[v]) {
if (!visited[i]) {
visited[i] = true;
q.push(i);
}
}
}
}
};
int main() {
int V = 6;
Graph g(V);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 4);
g.addEdge(3, 5);
g.addEdge(4, 5);
g.BFS(0);
return 0;
}在这个示例中:
Graph 类表示图,V 是顶点数量,adj 是邻接表,用于存储每个顶点的邻接顶点。addEdge 函数用于向图中添加边,将一个顶点的邻接顶点添加到其对应的邻接表中。BFS 函数实现了广度优先遍历。它接受一个起始顶点索引 start。首先创建一个用于记录访问状态的向量 visited 和一个队列 q,将起始顶点标记为已访问并放入队列。在循环中,只要队列不为空,就取出队首顶点,访问该顶点,然后遍历它的邻接顶点。对于未被访问的邻接顶点,标记为已访问并放入队列。main 函数中,创建了一个有 6 个顶点的图,添加了一些边,然后从顶点 0 开始进行广度优先遍历。带权有向图 带权有向图如下图所示,要求指定初始点,从初始点出发进行图的遍历。

平台会对你编写的代码进行测试:
测试输入:
0预期输出:
从顶点0开始的DFS:
0 1 2 5 4 3
从顶点0开始的BFS:
0 1 3 2 5 4【提示:输出遍历顶点的格式为 printf("%3d",v);】
开始你的任务吧,祝你成功!
#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;
}