任务描述
本关任务:编写一个程序实现图的遍历。

相关知识
为了完成本关任务,你需要掌握:
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;  
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐