用C++完成图的深度优先遍历算法、广度优先遍历算法。其中,邻接表的创建相当于创建多个单链表。图内的字母节点可以自己输入
时间: 2024-03-10 08:46:16 浏览: 63
好的,以下是使用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;
}
```
希望这个实现对您有所帮助!
阅读全文