用C++完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。图内的字母节点可以自己输入
时间: 2024-03-10 14:46:16 浏览: 67
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
好的,以下是使用C++实现图的深度优先遍历算法和广度优先遍历算法,其中节点由用户输入,邻接表使用单链表实现。
```c++
#include <iostream>
#include <queue>
#include <vector>
#include <unordered_map>
using namespace std;
// 定义图的节点结构体
struct GraphNode {
char label; // 节点的字符标签
vector<GraphNode*> neighbors; // 存储与该节点相邻的所有节点指针
GraphNode(char x) : label(x) {}; // 构造函数
};
// 深度优先遍历算法
void dfs(GraphNode* node, vector<bool>& visited) {
visited[node->label - 'a'] = true; // 标记该节点已被访问
cout << node->label << " "; // 输出该节点的标签
// 遍历该节点的所有相邻节点,若未被访问,则递归访问该节点
for (int i = 0; i < node->neighbors.size(); i++) {
GraphNode* neighbor = node->neighbors[i];
if (!visited[neighbor->label - 'a']) {
dfs(neighbor, visited);
}
}
}
// 广度优先遍历算法
void bfs(GraphNode* node, vector<bool>& visited) {
queue<GraphNode*> q; // 定义队列存储待访问的节点
q.push(node); // 将起始节点加入队列
visited[node->label - 'a'] = true; // 标记该节点已被访问
while (!q.empty()) {
GraphNode* cur = q.front(); // 取出队首节点
q.pop();
cout << cur->label << " "; // 输出该节点的标签
// 遍历该节点的所有相邻节点,若未被访问,则加入队列
for (int i = 0; i < cur->neighbors.size(); i++) {
GraphNode* neighbor = cur->neighbors[i];
if (!visited[neighbor->label - 'a']) {
visited[neighbor->label - 'a'] = true;
q.push(neighbor);
}
}
}
}
int main() {
// 创建图的邻接表,其中节点由用户输入,存储在哈希表中
unordered_map<char, GraphNode*> graph;
int n;
cout << "请输入节点个数:";
cin >> n;
cout << "请输入每个节点的标签(单个字母):" << endl;
for (int i = 0; i < n; i++) {
char label;
cin >> label;
graph[label] = new GraphNode(label);
}
cout << "请输入每个节点的相邻节点(用空格隔开,回车结束):" << endl;
for (int i = 0; i < n; i++) {
char label;
cin >> label;
string neighbors;
getline(cin, neighbors);
for (int j = 0; j < neighbors.size(); j++) {
if (neighbors[j] != ' ') {
graph[label]->neighbors.push_back(graph[neighbors[j]]);
}
}
}
// 调用深度优先遍历算法
vector<bool> visited1(n, false);
dfs(graph.begin()->second, visited1);
cout << endl;
// 调用广度优先遍历算法
vector<bool> visited2(n, false);
bfs(graph.begin()->second, visited2);
cout << endl;
return 0;
}
```
希望这个实现对您有所帮助!
阅读全文