掌握图的存储结构,实现图的深度和广度优先遍历算法,用C++写出一个完整代码完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。图中字母节点需要自己输入
时间: 2024-03-10 13:46:46 浏览: 63
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
好的,以下是一个完整的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,以此类推。您可以根据自己的需求进行修改和扩展。
阅读全文