返回

图的介绍及图的遍历——理解图的基本概念和遍历算法

后端

图的介绍

图是一种数据结构,用来表示对象之间的关系。它由一组顶点和一组边组成。顶点表示对象,边表示对象之间的关系。图可以用来表示各种各样的关系,比如社交网络、交通网络、计算机网络等。

图的结构表达

图的结构可以用邻接表或邻接矩阵来表示。

  • 邻接表: 邻接表是一种用数组来表示图的结构的方式。数组中的每个元素对应一个顶点,数组中每个元素的值是一个链表,链表中包含了与该顶点相邻的所有顶点。
  • 邻接矩阵: 邻接矩阵是一种用二维数组来表示图的结构的方式。二维数组中的每个元素对应一个顶点对,二维数组中的每个元素的值表示两个顶点之间是否存在边。

图的模板定义

template <typename T>
struct Graph {
    // 顶点集合
    std::vector<T> vertices;
    // 边集合
    std::vector<std::vector<T>> edges;

    // 添加顶点
    void add_vertex(const T& vertex) {
        vertices.push_back(vertex);
        edges.push_back(std::vector<T>());
    }

    // 添加边
    void add_edge(const T& vertex1, const T& vertex2) {
        edges[vertex1].push_back(vertex2);
        edges[vertex2].push_back(vertex1);
    }

    // 广度优先遍历
    std::vector<T> BFS(const T& start) {
        std::queue<T> queue;
        std::vector<T> visited;

        queue.push(start);
        visited.push_back(start);

        while (!queue.empty()) {
            T current = queue.front();
            queue.pop();

            for (T neighbor : edges[current]) {
                if (std::find(visited.begin(), visited.end(), neighbor) == visited.end()) {
                    queue.push(neighbor);
                    visited.push_back(neighbor);
                }
            }
        }

        return visited;
    }

    // 深度优先遍历
    std::vector<T> DFS(const T& start) {
        std::stack<T> stack;
        std::vector<T> visited;

        stack.push(start);
        visited.push_back(start);

        while (!stack.empty()) {
            T current = stack.top();
            stack.pop();

            for (T neighbor : edges[current]) {
                if (std::find(visited.begin(), visited.end(), neighbor) == visited.end()) {
                    stack.push(neighbor);
                    visited.push_back(neighbor);
                }
            }
        }

        return visited;
    }
};

图的遍历

图的遍历是指访问图中的所有顶点和边。图的遍历有两种基本方法:广度优先遍历(BFS)和深度优先遍历(DFS)。

  • 广度优先遍历: 广度优先遍历从一个顶点开始,首先访问该顶点的所有相邻顶点,然后访问这些顶点的相邻顶点,以此类推,直到访问完图中的所有顶点。
  • 深度优先遍历: 深度优先遍历从一个顶点开始,一直沿着一条路径往下走,直到不能再走下去,然后回溯到上一个顶点,继续沿着另一条路径往下走,以此类推,直到访问完图中的所有顶点。

总结

图是一种重要的数据结构,可以用来表示各种各样的关系。图的结构可以用邻接表或邻接矩阵来表示。图的遍历有两种基本方法:广度优先遍历(BFS)和深度优先遍历(DFS)。