掌握图的存储结构,实现图的深度和广度优先遍历算法,用C++写出一个完整代码完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。图中字母节点需要自己输入
时间: 2024-03-10 19:46:46 浏览: 59
c++实现图的邻接表深度优先遍历,广度优先遍历
好的,以下是一个完整的C++代码,实现了邻接表存储图,并且包含了深度优先遍历和广度优先遍历算法:
```cpp
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 1000;
struct Edge {
int to, next; // to表示边的终点,next表示下一条边在链表中的位置
} edges[MAXN];
int head[MAXN], tot; // head存储所有节点的链表头指针,tot表示当前链表中边的数量
bool vis[MAXN]; // vis数组用于标记每个节点是否已访问
void addEdge(int u, int v) { // 添加一条从u到v的边
edges[++tot].to = v;
edges[tot].next = head[u];
head[u] = tot;
}
void dfs(int u) { // 从节点u开始深度优先遍历图
vis[u] = true;
cout << char(u + 'A') << " "; // 输出节点u的标识符
for (int i = head[u]; i != 0; i = edges[i].next) {
int v = edges[i].to;
if (!vis[v]) {
dfs(v);
}
}
}
void bfs(int u) { // 从节点u开始广度优先遍历图
queue<int> q;
q.push(u);
vis[u] = true;
while (!q.empty()) {
int x = q.front();
q.pop();
cout << char(x + 'A') << " "; // 输出节点x的标识符
for (int i = head[x]; i != 0; i = edges[i].next) {
int v = edges[i].to;
if (!vis[v]) {
q.push(v);
vis[v] = true;
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入节点数和边数
for (int i = 1; i <= m; i++) {
char u, v;
cin >> u >> v; // 输入一条边
addEdge(u - 'A', v - 'A'); // 将边加入图中
addEdge(v - 'A', u - 'A'); // 无向图需要加上反向边
}
dfs(0); // 从节点A开始深度优先遍历
cout << endl;
for (int i = 0; i < n; i++) {
vis[i] = false; // 重置vis数组
}
bfs(0); // 从节点A开始广度优先遍历
cout << endl;
return 0;
}
```
在这个代码中,我们将节点的标识符从字符转换为整数,从0开始编号,因此节点A对应的编号为0,节点B对应的编号为1,以此类推。您可以根据自己的需求进行修改和扩展。
阅读全文