返回
图的介绍及图的遍历——理解图的基本概念和遍历算法
后端
2023-11-12 08:14:01
图的介绍
图是一种数据结构,用来表示对象之间的关系。它由一组顶点和一组边组成。顶点表示对象,边表示对象之间的关系。图可以用来表示各种各样的关系,比如社交网络、交通网络、计算机网络等。
图的结构表达
图的结构可以用邻接表或邻接矩阵来表示。
- 邻接表: 邻接表是一种用数组来表示图的结构的方式。数组中的每个元素对应一个顶点,数组中每个元素的值是一个链表,链表中包含了与该顶点相邻的所有顶点。
- 邻接矩阵: 邻接矩阵是一种用二维数组来表示图的结构的方式。二维数组中的每个元素对应一个顶点对,二维数组中的每个元素的值表示两个顶点之间是否存在边。
图的模板定义
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)。