📜  如何在 C++ 中遍历地图(1)

📅  最后修改于: 2023-12-03 14:52:15.598000             🧑  作者: Mango

如何在 C++ 中遍历地图

地图是计算机科学中的一个重要数据结构,用于表示一些有空间关系的实体(如道路、城市、棋盘等)。在很多应用中,需要对地图进行遍历,以找到某些特定的信息,如最短路径、最小生成树、连通性等。本文将介绍如何在 C++ 中遍历地图,以及常见的遍历算法。

地图的表示方法

地图可以用多种数据结构来表示,例如邻接表、邻接矩阵、二维数组等。下面以邻接表为例,介绍如何定义一个简单的地图类型。

#include <vector>

using namespace std;

struct Edge {
    int to;     // 目标节点的编号
    int weight; // 边的权值,表示两个节点之间的距离等
};

using Graph = vector<vector<Edge>>;  // 邻接表表示的地图类型

上述代码定义了一个地图类型 Graph,它是一个嵌套的向量类型,其中每个节点都是一个包含了所有与其相邻的边的向量。每个边包含一个指向目标节点的编号 to和边的权值 weight

遍历算法
深度优先遍历

深度优先遍历是最简单且最常见的遍历算法之一。它的基本思想是尽可能地往某一方向深入,直到无法继续为止,然后回溯,转而深入其他方向。具体实现中,可以用递归来模拟这一过程。

下面是一个使用递归实现的深度优先遍历算法,它将遍历所有与起始节点 start 相连通的节点,并将它们的编号存入向量 visited 中。

void dfs(const Graph& G, int start, vector<int>& visited) {
    visited.push_back(start);
    for (const auto& edge : G[start]) {
        if (find(visited.begin(), visited.end(), edge.to) == visited.end()) {
            dfs(G, edge.to, visited);
        }
    }
}
广度优先遍历

广度优先遍历是另一种常见的遍历算法。它的基本思想是从某个起始节点开始,一层一层地扩展出所有相邻的节点,形成一棵树。具体实现中,可以用队列来存储待访问的节点,逐个弹出并将其邻居压入队列,直到队列为空为止。

下面是一个使用队列实现的广度优先遍历算法,它将遍历所有与起始节点 start 相连通的节点,并将它们的编号存入向量 visited 中。

void bfs(const Graph& G, int start, vector<int>& visited) {
    queue<int> Q;
    Q.push(start);
    visited.push_back(start);
    while (!Q.empty()) {
        int cur = Q.front();
        Q.pop();
        for (const auto& edge : G[cur]) {
            if (find(visited.begin(), visited.end(), edge.to) == visited.end()) {
                Q.push(edge.to);
                visited.push_back(edge.to);
            }
        }
    }
}
示例

下面是一个简单的示例,它定义了一个地图类型 Graph,并通过深度优先遍历和广度优先遍历来遍历与节点 0 相连通的所有节点。

#include <iostream>

using namespace std;

int main() {
    Graph G = {
        {{1, 0}, {2, 0}},           // Node 0
        {{0, 0}, {3, 0}, {4, 0}},   // Node 1
        {{0, 0}, {4, 0}},           // Node 2
        {{1, 0}},                   // Node 3
        {{1, 0}, {2, 0}}            // Node 4
    };

    vector<int> visited_dfs, visited_bfs;
    dfs(G, 0, visited_dfs);
    bfs(G, 0, visited_bfs);

    cout << "DFS:";
    for (int v : visited_dfs) {
        cout << " " << v;
    }
    cout << endl;

    cout << "BFS:";
    for (int v : visited_bfs) {
        cout << " " << v;
    }
    cout << endl;

    return 0;
}

运行结果:

DFS: 0 1 3 4 2
BFS: 0 1 2 3 4
总结

本文介绍了如何在 C++ 中遍历地图,包括地图的定义方法和常用的遍历算法。在实际应用中,不同的地图类型和遍历算法可以相互组合,形成各具特色的功能。希望这篇文章能够帮助读者更好地理解和应用地图。