C++完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。
时间: 2024-03-09 08:46:50 浏览: 100
这里是C++实现图的深度优先遍历算法和广度优先遍历算法的例子,其中使用邻接表来表示图结构。
```C++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 100;
// 邻接表结构体定义
struct EdgeNode {
int to; // 指向的结点
int weight; // 边权重
struct EdgeNode* next; // 下一个指向的结点
};
// Graph结构体定义
struct Graph {
EdgeNode* edges[MAXN]; // 边的指针数组
int n; // 结点数
};
// 初始化Graph
void initGraph(Graph& G, int n) {
G.n = n;
for (int i = 0; i < n; i++) {
G.edges[i] = NULL; // 初始化所有边
}
}
// 添加一条边
void addEdge(Graph& G, int u, int v, int weight) {
EdgeNode* p = new EdgeNode;
p->to = v;
p->weight = weight;
p->next = G.edges[u];
G.edges[u] = p;
}
// 深度优先遍历算法
void DFS(Graph& G, int u, bool visited[]) {
visited[u] = true;
cout << u << ' ';
for (EdgeNode* p = G.edges[u]; p != NULL; p = p->next) {
int v = p->to;
if (!visited[v]) {
DFS(G, v, visited);
}
}
}
// 广度优先遍历算法
void BFS(Graph& G, int u, bool visited[]) {
queue<int> q;
visited[u] = true;
q.push(u);
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << ' ';
for (EdgeNode* p = G.edges[u]; p != NULL; p = p->next) {
int v = p->to;
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
int main() {
Graph G;
initGraph(G, 4);
addEdge(G, 0, 1, 1);
addEdge(G, 0, 2, 1);
addEdge(G, 1, 2, 1);
addEdge(G, 2, 0, 1);
addEdge(G, 2, 3, 1);
addEdge(G, 3, 3, 1);
bool visited[MAXN];
memset(visited, false, sizeof(visited));
cout << "DFS: ";
DFS(G, 2, visited);
cout << endl;
memset(visited, false, sizeof(visited));
cout << "BFS: ";
BFS(G, 2, visited);
cout << endl;
return 0;
}
```
这个例子中,我们使用邻接表来表示图结构,邻接表中的每个元素是一个单链表,其中,每个结点表示一条边,边的指向的结点以及边的权重都存储在该结点中。我们使用一个数组来存储所有的链表,数组的下标表示结点的编号,数组中的元素指向该结点的链表头。在深度优先遍历算法和广度优先遍历算法中,使用一个bool类型的visited数组来标记每个结点是否被访问过,防止重复访问。
阅读全文
相关推荐















